普通继承
-
基类、派生类中都不含所有虚函数
例:
#include<iostream>
using namespace std;
class A{
public:
A(int a):ma(a){}
void Show()
{
cout<<"A::Show()"<<endl;
}
protected:
int ma;
};
class D :public A{
public:
D(int d):A(d),md(d){}
void Show()
{
cout<<"B:Show()"<<endl;
}
private:
int md;
};
int main()
{
cout<<"sizeof(D):"<<sizeof(D)<<endl;
return 0;
}
我们知道,在派生类的内存布局中,会将基类中的成员变量继承下来,并且基类中的成员的优先级高于派生类本身的成员,
故,class D的内存布局为:
sizeof(D)=8
代码运行结果:
-
基类中含有虚函数
将基类中的show()写为虚函数,我们知道当基类中的函数写为虚函数时,派生类中与这个虚函数同名同参的函数也就自动成为虚函数,而每个类中的虚函数的入口地址都会保存在这个类的虚表中,在类的内存布局中也会多出一个虚函数指针vfptr指向虚表,在进行虚表合并时派生类会使用本类的虚函数覆盖掉基类中的同名同参的虚函数,
故此时class D的内存布局为:
VS2012使用命令行选项查看对象的内存布局
sizeof(D)=12
运行结果:
-
基类中不含有虚函数,派生类中含有虚函数
注意:
虽然此时派生类的内存布局与基类中含有虚函数时的内存布局相同,sizeof(D)=12
但是,基类中含有虚函数时,派生类中的虚函数指针是进行虚表合并后的,当基类指针(引用)指向(引用)派生类对象时,指向(引用)的位置是虚函数指针的位置
而基类中不含有虚函数