游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2232|回复: 1

关于虚继承~

[复制链接]

5

主题

42

帖子

42

积分

注册会员

Rank: 2

积分
42
发表于 2010-12-15 20:46:00 | 显示全部楼层 |阅读模式
今天试了一下虚继承  ,按说使用了虚继承 那么只会保存一份副本, 假如不使用虚继承 ,会保存几份最开始的基类的副本 ,而且容易产生二义性 , 那么按道理讲 虚继承的size应该小于不使用的情况  ,但是用代码测试了下是相反的.不知有人研究过这个问题么~

#include <iostream>

//此处使用这个宏来确定是否使用虚继承
#define test

using std::cout;
using std::endl;

class base
{
public:
        base():a(1){cout<<"base"<<endl;}
        ~base(){cout<<"~base"<<endl;}
        int a;
};

#ifdef test
class child1:virtual public base
#else
class child1:public base
#endif

{
public:
        child1():b(2){cout<<"child1"<<endl;}
        ~child1(){cout<<"~child1"<<endl;}
        int b;
};

#ifdef test
class child2:virtual public base
#else
class child2:public base
#endif

{
public:
        child2():c(4){cout<<"child2"<<endl;}
        ~child2(){cout<<"~child2"<<endl;}
        int c;
};

#ifdef test
class child3:virtual public base
#else
class child3:public base
#endif

{
public:
        child3():d(5){cout<<"child3"<<endl;}
        ~child3(){cout<<"~child3"<<endl;}
        int d;
};

class grand:public child1,public child2,public child3
{
public:
        grand(){cout<<"grand"<<endl;}
        ~grand(){cout<<"~grand"<<endl;}
};

void main()
{
        cout<<sizeof grand<<endl;
}


我得到的结果是使用虚继承 grand 的size为28 不使用为24...vs05



另外不知这种钻石型继承 <看到别的地方是这么叫的> 是提倡使用还是尽量避免使用? 望各位授业解惑~~

0

主题

113

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2010-12-23 08:51:00 | 显示全部楼层

Re:关于虚继承~

你 class base 的数据成员太少。
把 int a;
改成
int a[100];
试验下。

另外,class grand 这个你没有区分是否虚继承。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-17 08:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表