gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:44:20 26 4
gpt4 key购买 nike

我的代码如下所示。 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有相同的 parent ,让我在这里使用虚拟继承?

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

更新:第二个问题与 -- 为什么 BC必须是 A 的导数明确地?


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

最佳答案

将您的代码修改为:

  // -- 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;
}
};
// --

关于c++ - 为什么虚拟继承在这种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20234654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com