1

我有以下代码:

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)

问题是它甚至没有进入函数。

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

4

1 回答 1

2

由于OP忽略了评论,让我在这里回答这个问题:

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

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

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

Base* b = new BaseImpl();

BaseImpl直接派生自,Base因此您具有标准的单继承。您的代码的行为与 if 相同,BaseDerived并且BaseDerivedImpl根本没有定义。您可以将它们注释掉,应用程序仍然会崩溃。

然后你调用doSomething这个实例,它就会崩溃。的实现doSomething如下:

// something

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

于 2013-03-20T13:53:13.360 回答