这个“基础”类构造了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;
}
虚拟基类的缺陷是什么?谢谢你回答我的琐碎问题。
答案 0 :(得分:6)
不可能仅base
构造一次而不是所有五种原始构造。您的程序中有四个完整对象,其中包含base
个子对象。这立即意味着无论您做什么,您将至少拥有四个 base
结构。
此外,使用其他答案中提到的虚拟继承的建议实际上需要更改其他类,而不是base
类。同时你的问题坚持要改变base
。
答案 1 :(得分:5)
当您创建base
类时,这只会构建top
。
class medium1:virtual public base{};
class medium2:virtual public base{};
其余的来自您创建对象b
,m1
和m2
的事实。你不能真正阻止调用基类的析构函数,因为,这就是你告诉编译器要做的事情。如果您不想创建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;
}