一、继承方式
-
类成员有三种属性,
public
、protected
和private
,这三者修饰的类成员的暴露级别是递减的。 -
继承方式有三种,公有继承、保护继承和私有继承。这三种继承方式都有一个共同的规律,那就是,子类继承父类后,父类的成员在子类中的暴露级别不能超过继承方式指定的暴露级别——原有暴露级别大于指定暴露级别的一律改为指定暴露级别,小于等于指定暴露级别的一律不变。
二、虚函数
-
继承基类的派生类除了能拥有基类的所有非静态成员之外,还被编译器嵌入了一枚指针,这枚指针指向一个表,我们称这枚指针为虚函数表指针,称这个表为虚函数表。
-
派生类虚函数表指针指向的虚函数表的内容分为两类,一类是是派生类自身的所有虚函数的入口地址,一类是基类中没有在派生类中定义过的所有虚函数的入口地址。
-
派生类的虚函数表指针不会被继承。
三、纯虚函数
class Base{
public:
virtual void foo() = 0;
};
foo()
是纯虚函数,Base
是抽象类,不能被实例化,想要发挥作用只能被继承。
继承这个基类的派生类必须定义 foo()
函数。
四、虚继承
-
虚继承基类的派生类除了能拥有基类的所有非静态成员之外,还被编译器嵌入一枚指针,这枚指针指向一个表,我们称这枚指针为虚基类表指针,称这个表为虚基类表。
-
在继承集体中该派生类有多少个子类,这个虚基类表就存储着多少个数,每个数是每个基类在该派生类中的偏移地址,派生类利用这些数来找到每个被自己继承的基类在自己的内存空间里的哪个位置。<