多继承
单继承中(一般继承),派生类会扩展基类的虚函数表。在多继承中,派生类含有多个基类的对象,该往哪个基类的虚函数表扩展呢?当派生类重写了基类的函数,需要覆盖多个基类的虚函数表吗?
- 每个基类都有自己的虚函数表
- 派生类的虚函数被放在声明的第一个基类的虚函数表中。
- 重写时,所有基类的同名函数都被派生类的同名函数覆盖。保证了基类指针指向派生类对象时,总是能够调用到真正的函数。
- 内存布局中,基类按照其声明顺序排列。
代码
class Base
{
public:
Base(int i) :baseI(i){};
virtual ~Base(){}
int getI(){ return baseI; }
static void countI(){};
virtual void print(void){ cout << "Base::print()"; }
private:
int baseI;
static int baseS;
};
class Base_2
{
public:
Base_2(int i) :base2I(i){};
virtual ~Base_2(){}
int getI(){ return base2I; }
static void countI(){};
virtual void print(void){ cout << "Base_2::print()"; }
private:
int base2I;
static int base2S;
};
class Drive_multyBase :public Base, public Base_2
{
public:
Drive_multyBase(int d) :Base(1000), Base_2(2000) ,Drive_multyBaseI(d){};
virtual void print(void){ cout << "Drive_multyBase::print" ; }
virtual void Drive_print(){ cout << "Drive_multyBase::Drive_print" ; }
private:
int Drive_multyBaseI;
};
继承类图为
对象模型
结果分析,同样无法显示派生类的新虚成员函数