带虚函数的菱形虚拟继承
来源:互联网 发布:买手机淘宝注册账号 编辑:程序博客网 时间:2024/05/18 02:10
菱形虚拟继承是单继承和多继承的结合,将类中的函数定义为虚函数。
结合实例看看它的实现过程:
class Animal{public:virtual void Funtest1(){cout << "Animal::Funtest1()" << endl;}virtual void Funtest2(){cout << "Animal::Funtest2()" << endl;}private:int _A;};class Donkey :virtual public Animal{public:virtual void Funtest1(){cout << "Donkey::Funtest1()" << endl;}virtual void Funtest2(){cout << "Donkey::Funtest2()" << endl;}private:int _D;};class Horse :virtual public Animal{public:virtual void Funtest3(){cout << "Horse::Funtest3()" << endl;}virtual void Funtest2(){cout << "Horse::Funtest2()" << endl;}private:int _D;};class Mule:public Donkey,public Horse{public:virtual void Funtest1(){cout << "Mule::Funtest1()" << endl;}virtual void Funtest2(){cout << "Mule::Funtest2()" << endl;}virtual void Funtest4(){cout << "Mule::Funtest4()" << endl;}private:int _M;};void Fun(Animal&A){A.Funtest1();A.Funtest2();}int main(){Mule m1;Fun(m1);m1.Funtest3();m1.Funtest4();system("pause");return 0;}
我们来逐个分析一下各个类的模型:
class Animal
{};
class Donkey:public Animal
{};
class Horse:public Animal
{};
class Mule:public Donkey,public Horse
{};
这就是带有虚函数的菱形虚拟继承,并且派生类中有自己的虚函数,上图就是它的结构示意图。
总结:
- (1)当一个类有虚函数时,在其对象的开始会生成一个虚表指针,指向的虚表中会存放虚函数的地址。
- (2)当一个派生类继承一个带有虚函数的基类时,派生类对象成员中基类部分中的虚表指针会被派生类所修改,成为派生类自己的虚表指针。在虚表中,如果虚函数在派生类中被重写那么就会存放被重写过的虚函数指针,如果没有重写基类的虚函数,就会单纯的继承下来存放基类的虚函数指针。
- (3)当一个派生类继承多个带有虚函数的基类时,派生类对象成员中基类部分中的虚表指针会被派生类所修改,成为派生类自己的虚表指针(相当于派生类自己有多个虚表指针)。如果重写了某个基类的虚函数,那么对应的去修改继承于这个基类的成员中的虚表,使指针指向派生类重写过得虚函数,如果没有重写就单纯的继承。
阅读全文
0 0
- 带虚函数的菱形虚拟继承
- 拥有虚函数覆盖的菱形继承及菱形虚拟继承
- 虚拟继承+虚函数,含有虚函数的菱形虚拟继承
- 菱形的虚拟继承
- 菱形继承(虚函数)->菱形虚拟继承(虚函数)->多态系列问题
- 继承,菱形继承,多态,虚继承、菱形虚拟继承
- 含有虚函数菱形的虚拟继承(没有对虚函数进行重写)
- 菱形虚拟继承&虚函数表&对象模型
- 继承:单继承、派生类成员的访问属性、多继承、菱形继承、虚继承,菱形虚拟继承
- 菱形继承&菱形虚拟继承
- 菱形继承&菱形虚拟继承
- 菱形继承--菱形虚拟继承
- 【C++】菱形继承与虚拟菱形继承的对比分析
- 菱形虚拟继承和菱形继承的对比
- 菱形继承与菱形虚拟继承的相关问题
- c++ --------- 多态下的菱形继承,菱形虚拟继承
- 菱形继承的虚函数表
- 虚拟继承和菱形虚拟继承的剖析
- Python的使用
- python的数据类型
- CSS伪类选择器nth-child 选择3的倍数个元素写法
- Java笔记第五课(对象&方法)
- 重磅!阿里巴巴正式开源全球化OpenMessaging和ApsaraCache项目
- 带虚函数的菱形虚拟继承
- Android 基本常用控件ListView的简单应用
- STM32F1xx固件库级及部分资料下载
- Python资源汇集网站推荐:awesome-python
- Linux内存中的 buffer 和 cache
- 运用java中的wait和notifyAll方法模拟玩家等待游戏进入场景
- JAVA代码优化方法
- Linux 性能监控
- c++迭代器介绍