【发布时间】:2019-10-29 19:07:31
【问题描述】:
在下面的代码中,为什么我必须在B 和C 两个类中虚拟地继承类A?
我了解到第一个编译器会在派生类中找到目标函数。如果在其中找不到,则编译器必须在其基类中进行搜索。所以,如果我实际上只继承一次(A 类),那么编译器应该只通过一条路径找到目标函数(aa()),即在下面的情况下,D 到 C 到 A。
如果我只继承一次,那么问题仍然存在。
#include <iostream.h>
using namespace std;
class A
{
public:
void aa() { cout<<"aa"<<endl; }
};
class B: public virtual A
{ };
class C: public /*virtual*/ A
{ };
class D: public C,public B
{ };
int main()
{
D d1;
d1.aa();
return 0;
}
我收到此错误:
Error : Member is ambiguous: 'A::aa' and 'A::aa' in function `main()`
【问题讨论】:
-
您为什么认为它会起作用?你能说出你的直觉吗?
-
... 编译器必须在它的 all 基类中搜索 我强调 all 因为它意味着 所有 基类。这就是编译器找到两个匹配项的时候。
-
@dr-gut 我在编辑后合并了您的编辑(语法修复)(我的编辑在语法上较差)
-
实际上有两个继承路径:D-C-A 和 D-B-A 所以两个 A 实例和两组实例成员。
标签: c++ multiple-inheritance virtual-inheritance