面向对象核心
1.继承
定义:在已存在类的基础上,创建新的类。会拥有原有类的一些特性。通常会在原有类基础上做修改和增加操作。
已经存在的类成为父类或基类
新创建的类称为子类或派生类
#include <iostream>
using namespace std;
class Father{
public:
string first_name="李";
void work(){
cout<<"我是名厨师"<<endl;
}
};
class Son:public Father{ //公共继承
};
int main()
{
Son s;
cout<<s.first_name<<endl;
s.work();
}
函数隐藏:如果子类中给出与父类同名的函数,父类中所有同名函数都被隐藏。如果需要访问需要父类的作用域限定符的方式进行访问
#include <iostream>
using namespace std;
class Father{
public:
string first_name="王";
void work(){
cout<<"我是名厨师"<<endl;
}
};
class Son:public Father{ //公共继承
public: //权限不写默认是私有的
void work(){
cout<<"工程师"<<endl;
}
void study(){
cout<<"喜欢学习"<<endl;
}
};
int main()
{
Son s;
cout<<s.first_name<<endl;
s.work();
s.Father::work();//可以访问被隐藏的父类函数
s.study();
}
2.继承注意事项(掌握):
- 父类的构造函数不会继承下来
- 子类一定要直接或者间接的调用父类的构造函数。来完成从父类继承过来数据的初始化。如果子类不写明如何调用父类的构造函数,这时会调用父类无参的构造函数,如果父类中没有无参的构造函数,这时就会报错
子类构造函数直接调用父类构造函数
#include <iostream>
using namespace std;
class Father{
private:
string name;
public:
Father(string name){
this->name=name;
}
void work(){
cout<<name<<"是名厨师"<<endl;
}
};
class Son:public Father{ //公共继承
public:
//Son(string n):name(n){} //错误:name是父类私有属性,子类不能直接访问
Son(string n):Father(n){}
};
int main()
{
Son s("小明");
s.work();
}
3.权限(掌握)
注意:权限不写默认是私有
不同权限访问情况
不同权限的成员,在不同位置的可访问情况
public 本类中可以可以访问 在子类中可以访问 在全局中可以访问
protected 本类中可以可以访问 在子类中可以访问 在全局中不可以访问
private 本类中可以可以访问 在子类中不可访问 在全局中不可以访问
#include <iostream>
using namespace std;
class Father{
//只作为验证
public:
string first_name="王";
protected:
string car="宝马";
private:
string password="123789";
public:
void show(){
cout<<first_name<<" "<<car<<" "<<password<<endl;
}
};
class Son:public Father{
public:
void show(){
cout<<first_name<<endl;
cout<<car<<endl;
//cout<<password<<endl; //错误:父类私有成员子类不能直接访问
}
};
int main()
{
Father f;
cout<<f.first_name<<endl;
//cout<<f.car<<endl; //保护权限全局中不可直接访问
//cout<<f.password<<endl; //私有权限全局中不可直接访问
}
不同权限的继承 (掌握)
- 任何权限的继承,私有权限成员继承之后,都不能直接访问
- 排除私有成员的情况下,公有继承全不变,保护继承变保护,私有继承变私有
私有继承时父类的私有成员 在子类中变成私有 应该是子类中不可直接访问
public继承(掌握)
公有继承使用最多
父类public权限成员 |
父类protected权限成员 |
父类私有权限成员 |
|
public继承后在子类中的情况 |
成为子类中public成员 |
成为子类中protected成员 |
能够继承下来,不能直接访问 |
#include <iostream>
using namespace std;
class Father{
public:
string pubstr="pub";
protected:
string prostr="pro";
private:
string pristr="pri";
};
class Son:public Father{
public:
void method(){
cout<<pubstr<<endl;
cout<<prostr<<endl;
//cout<<pristr<<endl; //父类中私有的成员在子类中不能直接访问
}
};
int main()
{
Son s;
s.method();
cout<<s.pubstr<<endl; //Father类中public成员在Son中也是public权限
//cout<<s.prostr<<endl; //在子类中是保护权限
}
protected继承
父类public权限成员 |
父类protected权限成员 |
父类私有权限成员 |
|