C从多个具有相同虚函数名的基类继承

新手上路,请多包涵

我试过这段代码:

 class A
{
    virtual void foo() = 0;
};

class B
{
    virtual void foo() = 0;
};

class C : public A, public B
{
    //virtual void A::foo(){}
    //virtual void B::foo(){}

    virtual void A::foo();
    virtual void B::foo();
};

void C::A::foo(){}
void C::B::foo(){}

int main()
{
    C c;
    return 0;
}

使用注释部分是可以的,但是当我尝试在类声明之外编写定义时,编译器会报告错误。我正在使用 MSVC11 编译器,有人知道如何编写吗?我需要将代码移动到 cpp 文件中。

谢谢~~

原文由 watson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 344
1 个回答

函数根据名称和参数类型覆盖基类的虚函数(见下文)。因此,你的类 C两个 虚函数 foo ,从每个继承一个 AB 但是函数 void C::foo() 会覆盖 _两者_:

[class.virtual]/2

If a virtual member function vf is declared in a class Base and in a class Derived , derived directly or indirectly from Base , a成员函数 vf 具有相同的名称、 _参数类型列表_、cv 限定和 ref 限定符(或不存在相同),然后声明 Base::vf Derived::vf 也是虚拟的(无论是否如此声明)并且它 覆盖 Base::vf

正如我在评论中已经说过的,[dcl.meaning]/1 禁止在(成员)函数的声明中使用 限定 ID

declarator-id 被限定时,该声明应引用该限定符所引用的类或命名空间的先前声明的成员 […]“

因此,任何 virtual void X::foo(); 作为 C 中的声明都是非法的。

编码

class C : public A, public B
{
    virtual void foo();
};

是 AFAIK 覆盖 foo 的唯一方法,它将覆盖 A::fooB::foo 。除了引入另一层继承之外,没有办法对 A::fooB::foo 有两种不同的覆盖:

 #include <iostream>

struct A
{
    virtual void foo() = 0;
};

struct B
{
    virtual void foo() = 0;
};

struct CA : A
{
    virtual void foo() { std::cout << "A" << std::endl; }
};

struct CB : B
{
    virtual void foo() { std::cout << "B" << std::endl; }
};

struct C : CA, CB {};

int main() {
    C c;
    //c.foo();  // ambiguous

    A& a = c;
    a.foo();

    B& b = c;
    b.foo();
}

原文由 dyp 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题