一、虚拟继承+虚函数
场景①:派生类没有自己的虚函数,只是继承基类的虚函数
我们看一个例子:
class Base
{
public:
virtual void FunTest1()
{
cout << "Base::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Base::FunTest2()" << endl;
}
int _b;
};
class Derived :virtual public Base
{
public:
virtual void FunTest1()
{
cout << "Derived::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Derived::FunTest2()" << endl;
}
int _d;
};
typedef void(*FunSrc)();
void print(Base&b)//打印函数
{
FunSrc* pfun = (FunSrc*)(*(int*)&b);
while (*pfun)
{
(*pfun)();
pfun++;
}
}
int main()
{
Derived d;
Derived& d1 = d;
d._b = 1;
d._d = 2;
print(d);
system("pause:");
return 0;
}
分析一下:
②派生类有自己的虚函数
class Base
{
public:
virtual void FunTest1()
{
cout << "Base::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Base::FunTest2()" << endl;
}
int _b;
};
class Derived :virtual public Base
{
public:
virtual void FunTest1()
{
cout << "Derived::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Derived::FunTest2()" << endl;
}
virtual void FunTest3()
{
cout << "Derived::FunTest3()" << endl;
}
int _d;
};
typedef void(*FunSrc)();
void print(Base&b)//打印函数
{
FunSrc* pfun = (FunSrc*)(*(int*)&b);
while (*pfun)
{
(*pfun)();
pfun++;
}
}
void print(Derived&d)//打印函数
{
FunSrc* pfun = (FunSrc*)(*(int*)&d);
while (*pfun)
{
(*pfun)();
pfun++;
}
}
分析一下:
总结:
1.同一个类的对象共用一张虚表;
2.派生类和基类各自的虚表。
二、菱形虚拟继承(含虚函数)
举个例子:
class B
{
public:
virtual void FunTest1()
{
cout << "B::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "B::FunTest2()" << endl;
}
int _b;
};
class C1 :virtual public B
{
public:
virtual void FunTest1()
{
cout << "C1::FunTest1()" << endl;
}
virtual void FunTest3()
{
cout << "C1::FunTest3()" << endl;
}
int _c1;
};
class C2 :virtual public B
{
public:
virtual void FunTest1()
{
cout << "C2::FunTest1()" << endl;
}
virtual void FunTest4()
{
cout << "C2::FunTest4()" << endl;
}
int _c2;
};
class D :public C1,public C2
{
public:
virtual void FunTest1()
{
cout << "D::FunTest1()" << endl;
}
virtual void FunTest3()
{
cout << "D::FunTest3()" << endl;
}
virtual void FunTest5()
{
cout << "D::FunTest5()" << endl;
}
int _d;
};
分析一下:
对于含有虚函数的菱形虚拟继承,我们要考虑的内容就比较复杂了,菱形虚拟继承存在多继承的,多继承的规则要把握好。虚拟继承包括偏移量表格。