我有以下代码:
class Base
{
public:
virtual void doSomething() = 0;
};
class BaseImpl : public virtual Base
{
public:
virtual void doSomething() {
// something
}
};
class BaseDerived: public virtual Base
{
public:
virtual void doSomething2() = 0;
};
class BaseDerivedImpl: public BaseImpl, public BaseDerived
{
public:
virtual void doSomething2(){
// sonething2
}
};
然后我
Base* b = new BaseImpl();
b->doSomething(); // fatal error at this line (not in the method, but in the method invocation)
问题在于它甚至没有进入该功能。
使用这种层次结构有问题吗?
答案 0 :(得分:2)
由于OP无视评论,让我回答一下这个问题:
使用这种层次结构有问题吗?
不,没有错。这是如何解决“可怕的钻石”问题的标准方法(实际上并不是那么可怕)。
然而,钻石在这个例子中甚至没有发挥作用:
Base* b = new BaseImpl();
BaseImpl
直接来自Base
,因此您拥有标准的单一继承。您的代码行为与BaseDerived
和BaseDerivedImpl
根本没有定义的行为相同。你可以将它们评论出来,应用程序仍会崩溃。
然后你在这个实例上调用doSomething
并且它崩溃了。 doSomething
的实施如下:
// something
因此,我的结论是// something
会导致崩溃,但如果没有看到该方法的实现,就无法判断。