我有一个如下所示的代码。 XBase
和XBar
是X
库的类,因此我无法更改它们。
#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)为什么编译器无法发现Base
和XBar
具有相同的父级,让我在这里使用虚拟继承?
2)例如,如果B
和C
具有共同的祖先A
,是否可以使用虚拟继承,但它们具有不同的基类?
它就像diamond,但C
和A
之间还有另一个类。
UPD:
第二个问题相同 - 为什么B
和C
必须明确地是A
的派生?
最好避免多重继承,而且,我想,这将是一种解决方法,但问题仍然存在。
答案 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)
我认为问题是XBar
和Base
不使用XBase
的虚拟继承。如果他们这样做我认为它会起作用。但定义的XBar
和Base
都需要自己的个人XBase
。