-2

这个“基”类为 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;
}

虚拟基类的陷阱是什么?感谢您回答我的琐碎问题。

4

5 回答 5

6

不可能base只构造一次而不是全部五个原始构造。您的程序中有四个包含子对象的完整对象base。这立即意味着无论你做什么,你都会有至少四个 base结构。

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

于 2012-08-14T21:26:09.910 回答
5

当你创建一个类时,它只会构造base一次。top

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

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

于 2012-08-14T21:23:28.760 回答
2

您可以将其设为virtual基类,但这会带来一大堆 陷阱

于 2012-08-14T21:23:29.557 回答
1

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

class medium1:virtual public base{}m1;

class medium2: virtual public base{}m2;
于 2012-08-14T21:23:48.683 回答
1

这让你只需要两个电话,但我认为既然你有双重继承,那是你能得到的最好的。如果您消除了定义中的变量bbase那么您就在那里。 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;
}
于 2012-08-14T21:34:32.553 回答