具有多态性的“可怕的钻石”

时间:2013-03-20 13:32:52

标签: c++ virtual

我有以下代码:

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)

问题在于它甚至没有进入该功能。

使用这种层次结构有问题吗?

1 个答案:

答案 0 :(得分:2)

由于OP无视评论,让我回答一下这个问题:

  

使用这种层次结构有问题吗?

不,没有错。这是如何解决“可怕的钻石”问题的标准方法(实际上并不是那么可怕)。

然而,钻石在这个例子中甚至没有发挥作用:

Base* b = new BaseImpl();

BaseImpl直接来自Base,因此您拥有标准的单一继承。您的代码行为与BaseDerivedBaseDerivedImpl根本没有定义的行为相同。你可以将它们评论出来,应用程序仍会崩溃。

然后你在这个实例上调用doSomething并且它崩溃了。 doSomething的实施如下:

// something

因此,我的结论是// something会导致崩溃,但如果没有看到该方法的实现,就无法判断。