为什么虚拟继承在这种情况下不起作用?

时间:2013-11-27 05:32:43

标签: c++ inheritance multiple-inheritance

我有一个如下所示的代码。 XBaseXBarX库的类,因此我无法更改它们。

#include <iostream>
using namespace std;

// -- library stuff -- I can't change this
struct XBase {
    virtual void foo() = 0;
};

struct XBar : public XBase {
    virtual void foo() {
        cout << "XBar::foo()" << endl;
    }
};
// --


// -- my stuff --
struct Base : public XBase {
    virtual void foo() {
        cout << "Base::foo()" << endl;
    }
};

struct Bar : public virtual Base, public virtual XBar { // <-- that's ok, but doesn't let use XBase pointer to Bar instance
    virtual void foo() {
        cout << "Bar::foo()" << endl;
    }
};
// --

int main() {
    Bar bar;
    bar.foo();
    static_cast<Base*>(&bar)->foo();
    static_cast<XBar*>(&bar)->foo();

    static_cast<XBase*>(&bar)->foo();
    return 0;
}

由于Bar定义无效,因此未编译代码。

1)为什么编译器无法发现BaseXBar具有相同的父级,让我在这里使用虚拟继承?

2)例如,如果BC具有共同的祖先A,是否可以使用虚拟继承,但它们具有不同的基类?
它就像diamond,但CA之间还有另一个类。

UPD: 第二个问题相同 - 为什么BC必须明确地是A的派生?


最好避免多重继承,而且,我想,这将是一种解决方法,但问题仍然存在。

2 个答案:

答案 0 :(得分:1)

将您的代码修改为:

  // -- library stuff -- 
struct XBase {
  virtual void foo() = 0;
};

struct XBar : public XBase {
  virtual void foo() {
    cout << "XBar::foo()" << endl;
  }
};
// --


// -- my stuff --
struct Base : public virtual XBar {
  virtual void foo() {
    cout << "Base::foo()" << endl;
  }
};

struct Bar : public  Base { 
  virtual void foo() {
    cout << "Bar::foo()" << endl;
  }
};
// --

答案 1 :(得分:0)

我认为问题是XBarBase不使用XBase的虚拟继承。如果他们这样做我认为它会起作用。但定义的XBarBase都需要自己的个人XBase