3

我有这个

    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'

不知道如何解决这个问题。

提前致谢。

4

3 回答 3

9

如果您在层次结构中只需要一个父级副本,请使用虚拟继承。

class B : public virtual A

编辑:
MSVC++ 2010 中可能存在错误。Intellisense 没有检测到问题,但编译器对此感到窒息。奇怪,因为 VC6 对它很满意。

作为一种解决方法,如果您按如下方式声明 D,它会使 MSVC++ 2010 开心,同时也可以在没有此问题的编译器中工作:

class D: public virtual A, public B, public C
于 2010-08-28T22:07:14.717 回答
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; }
};

要么你没有按照你所说的去做,要么你的编译器坏了。发布您尝试编译的真实代码。

PS我刚刚尝试在 VS 2010 Express 中编译它并得到了同样的错误。正如 Gunslinger47 在评论中所建议的那样,这是 VS 2010 编译器中的一个错误。

于 2010-08-28T22:37:41.577 回答
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;
}
于 2010-08-28T22:10:41.120 回答