【发布时间】:2017-02-20 11:32:51
【问题描述】:
我的编程课程有一个作业要求我设计一个抽象,从该抽象派生两个类,并从这两个派生类派生另一个类。
这带来了致命的死亡钻石问题。这可以通过虚拟继承来解决,尽管我需要将我的前两个类的对象实例化为我的抽象类的指针。而这不能通过任何类型的虚拟继承来完成。因此,如果有一种方法可以指定多重继承类将从其派生的基类,那将是非常有用的。
例子:
#include <iostream>
using namespace std;
class Base {
public:
virtual void foo(){};
virtual void bar(){};
};
class Der1 : public Base {
public:
virtual void foo();
};
void Der1::foo()
{
cout << "Der1::foo()" << endl;
}
class Der2 : public Base {
public:
virtual void bar();
};
void Der2::bar()
{
cout << "Der2::bar()" << endl;
}
class Join : virtual Der1, virtual Der2 {
private:
int atribb;
};
int main()
{
Base* obj = new Join();
((Der1 *)(obj))->foo();
}
编译器错误:
nueve.cpp:在函数“int main()”中:
nueve.cpp:43:30: 错误:‘Base’是‘Join’的模糊基数
Base* obj = new Join();
【问题讨论】:
-
查找纯虚函数并认真考虑让 Base 拥有这些。
-
当你说“这不能通过任何类型的虚拟继承来完成”。你的意思是?我最初读到它是说您的类不允许您为此分配使用虚拟继承,但也许您的意思是您实际上确实想使用虚拟继承但不能做您想做的事情?
-
" 要求我设计一个从中派生出两个类的抽象" - 但这不是你所做的,
Base不是抽象的。您应该使Base的函数成为纯虚拟函数(添加=0)。我不确定在这种情况下您是否还需要虚拟继承。 -
“死亡之钻”通常是一种“我不懂多重继承”的丰富多彩的说法。
标签: c++ c++11 inheritance