C++继承的理解
-
1.继承的概念
-
1.简单的来说就是对基类当中的成员变量和成员函数的一种继承,在派生类当中也可以继续使用
-
2.通过继承的访问限定符,可以限制基类中的内容不让派生类来使用
-
3.前面所使用的复用是在函数层面进行的复用,继承是在类的层面进行的复用
-
4.基类当中的private的内容同样也继承到派生类中,但是派生类不能够访问该内容
-
-
2.基类与派生类之间赋值
class person { protected: std::string school = "MIT"; }; class master:public person { public: void print() { std::cout << "information:" <<person::school<<"_"<<name <<"_"<<gender<<"_"<<age << std::endl; } protected: std::string name = "Jolly.Roger"; std::string gender = "male"; size_t age = 24; }; int main() { //可以进行 master m1; person p1=m1; person* p2=&m1; person& p3=m1; //基类指针强制类型赋值给派生类 master& m2=(master*)p2 //不可以进行 person p3; m1=p3; master& m4=p3; return 0; }
- 派生类里面的东西(值,指针,引用)可以赋值给基类(这里的赋值是语法天然支持的)
- 基类里面的东西(值,引用)不可以赋值给派生类,但是基类的指针可以通过强制类型转换赋值给派生类
- 为了方便理解和记忆,可以想象成基类的内容少,派生类的内容多,少的不能给多,但是多的可以给少的,多余部分不要
-
3.继承当中的作用域
- 两者都有其独立的作用域,派生类里面由与基类同名的成员变量时,派生类将优先屏蔽基类当中的成员变量,想要访问时使用基类名::成员变量
- 基类与派生类有相同的成员函数名时,派生类同样对其进行隐藏
-
4.继承当中的构造函数
- 在派生类里面,如果调用的是基类的成员变量,将会使用基类里面构造函数
- 在派生类里面,如果调用的是派生类的成员变量,将会使用派生类里面构造函数
- 如果基类没有默认的构造函数,则要派生类构造函数的初始化列表阶段显示调用
-
5.继承当中的友元
- 友元关系不能够继承,也就是说基类友元不能够访问子类私有和保护成员
-
6.继承当中的静态函数
-
如果在基类里面定义了一个静态变量,则该继承体系里面该成员变量就只有一个,无论派生出多少个类,都只有这一个
class person { public: person() { ++num; } protected: std::string school = "MIT"; public: static int num; }; int person::num = 0; class master:public person { public: void print() { std::cout << "information:" <<person::school<<"_"<<name <<"_"<<gender<<"_"<<age << std::endl; } protected: std::string name = "Jolly.Roger"; std::string gender = "male"; size_t age = 24; };
Lp700::master m1; Lp700::master m2; Lp700::master m3; std::cout << Lp700::person::num << std::endl; Lp700::master::num = 0; std::cout << Lp700::person::num << std::endl; 输出结果:3 0
-
-
7.继承当中的虚拟继承
-
为什么会存在虚拟继承呢?
-
因为继承中存在多继承->多继承当中会存在由菱形继承->菱形继承会出现数据的二义性和数据冗余
-
-
什么是虚拟继承?
- 就是在正常的继承前面加上一个关键字virtual
-
虚拟继承的原理是什么?
未使用虚拟继承
使用虚拟继承
-
- 1.使用了虚拟继承之后,A类里面的成员不会在每一个继承体系里都有一份,而是单独放了一份,每一个继承体系通过虚基表指针找到相对偏移量,每一个继承体系通过相对偏移量来查找A这个基类里面得到成员,这样可以有效的避免数据的二义性和数据的冗余。