基类构造五次

时间:2012-08-14 21:21:22

标签: c++ class constructor

这个“基础”类构造了b,medium1和medium2。当我使用“顶级”课程时,它构建了2倍以上。完全构建5次(写入屏幕5次)。

问题:我可以在“基础”课程中更改一下,使其只构建一次,并且一劳永逸。

#include "stdafx.h"
#include<stdlib.h> 

class base
{
public:
    base(){x=5;printf(" %i ",x);}
    int x;
}b;

class medium1:public base{}m1;

class medium2:public base{}m2;

class top:public medium1,medium2{};


int main() {
    top ten;
    getchar();
    return 0;
}

虚拟基类的缺陷是什么?谢谢你回答我的琐碎问题。

5 个答案:

答案 0 :(得分:6)

不可能仅base构造一次而不是所有五种原始构造。您的程序中有四个完整对象,其中包含base个子对象。这立即意味着无论您做什么,您将至少拥有四个 base结构。

此外,使用其他答案中提到的虚拟继承的建议实际上需要更改其他类,而不是base类。同时你的问题坚持要改变base

答案 1 :(得分:5)

当您创建base类时,这只会构建top

class medium1:virtual public base{};
class medium2:virtual public base{};

其余的来自您创建对象bm1m2的事实。你不能真正阻止调用基类的析构函数,因为,这就是你告诉编译器要做的事情。如果您不想创建base个对象,请不要从中派生。

答案 2 :(得分:2)

您可以将其设为virtual base class,但附带giant set pitfalls

答案 3 :(得分:1)

如果使用虚拟继承,则可以拥有一个base类对象:

class medium1:virtual public base{}m1;

class medium2: virtual public base{}m2;

答案 4 :(得分:1)

这可以让你接到两个电话,但我认为既然你有双重继承,那就是你得到的最好的。如果您删除了b定义中的变量base,那么您就在那里。 http://codepad.org/pn016D7b

#include<stdlib.h> 

class base
{
public:
    base(){x=5;printf(" %i ",x);}
    int x;
}b;

class medium1:virtual public base 
{
public:
    medium1():base(){};
};

class medium2:virtual public base{};

class top:virtual public medium1,medium2{};


int main() {
    top ten;
    getchar();
    return 0;
}