首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++奇怪的菱形继承问题

C++奇怪的菱形继承问题
EN

Stack Overflow用户
提问于 2010-08-29 05:58:16
回答 2查看 881关注 0票数 3

我有这个

代码语言:javascript
运行
复制
    A
  /   \
 B     C
  \   /
    D

A有一个纯虚拟函数,原型如下:

代码语言:javascript
运行
复制
virtual A* clone(void) const = 0;

B和C实际上继承自A( class B: public virtual Aclass C: public virtual A)

B具有虚拟函数,原型如下:

代码语言:javascript
运行
复制
virtual B* clone(void) const {}; 

C具有虚拟函数,原型如下:

代码语言:javascript
运行
复制
virtual C* clone(void) const {};

D从B&C继承而来,如下所示:class D: public B, public C D具有虚拟函数,原型如下:

代码语言:javascript
运行
复制
virtual D* clone(void) const {};

现在,在编译时,我得到了以下6行错误:

代码语言:javascript
运行
复制
error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const'

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-29 06:10:41

避免钻石继承?;->

无论如何,这是样本(真正的样本-不要那样投射)

// ConsoleCppTest.cpp :定义控制台应用程序的入口点。//

代码语言:javascript
运行
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2010-08-29 06:37:42

你在原始帖子中描述的内容是完全合法的。由Comeau在线编译器编译的一个快速示例代码完全可以做到这一点,没有任何错误

代码语言:javascript
运行
复制
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.我刚刚尝试在VS2010Express中编译它,得到了同样的错误。正如Gunslinger47在评论中所暗示的那样,这是VS2010编译器中的一个错误。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3592648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档