我有这个
A
/ \
B C
\ /
D
A具有纯虚函数,原型为:
virtual A* clone(void) const = 0;
B和C几乎继承自A(class B: public virtual A
,class C: public virtual A
)
B具有虚函数,原型为:
virtual B* clone(void) const {};
C具有虚函数,原型为:
virtual C* clone(void) const {};
D继承自B& C那样:class D: public B, public C
D具有虚函数,原型为:
virtual D* clone(void) const {};
现在,在编译时,我得到以下6行错误:
error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const'
如何解决这个问题并不奇怪。
提前致谢。
答案 0 :(得分:9)
如果您只想在层次结构中使用父级的一个副本,请使用虚拟继承。
class B : public virtual A
修改:
MSVC ++ 2010中可能存在错误.Intellisense没有检测到问题,但编译器会对其进行扼流。奇怪,因为VC6对它很满意。
作为一种解决方法,如果您按如下方式声明D,它会让MSVC ++ 2010感到高兴,同时也可以在没有此问题的编译器中工作:
class D: public virtual A, public B, public C
答案 1 :(得分:5)
您在原始帖子中描述的内容完全合法。一个快速的示例代码,完全可以编译而没有Comeau Online编译器的任何错误
class A {
public: virtual A* clone() const = 0;
};
class B: public virtual A {
public: virtual B* clone() const { return 0; }
};
class C: public virtual A {
public: virtual C* clone() const { return 0; }
};
class D: public B, public C
{
public: virtual D* clone() const { return 0; }
};
要么你没有做你说你正在做的事情,要么你的编译器坏了。发布您要编译的真实代码。
P.S。我刚试过在VS 2010 Express中编译它并得到了同样的错误。正如Gunslinger47在评论中所暗示的那样,这是VS 2010编译器中的一个错误。
答案 2 :(得分:1)
避免钻石继承? ; - >
无论如何,这里是样本(真的是样本 - 不要像那样投射)
// ConsoleCppTest.cpp:定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include "iostream"
class A {
public:
virtual void* clone() = 0;
};
class B: public A {
public:
virtual void* clone() = 0;
};
class C: public A {
public:
virtual void* clone() = 0;
};
class D: public B, public C
{
public:
virtual void* B::clone()
{
std::cout << "B";
return (void*)this;
}
virtual void* C::clone()
{
std::cout << "C";
return (void*)this;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
D* d = new D();
void* b = ((B*)d)->clone();
void* c = ((C*)d)->clone();
return 0;
}