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

C从具有相同虚函数名称的多个基类继承,第1张

概述我试过这段代码: 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 voi 我试过这段代码:

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文件中.

谢谢~~

解决方法 函数根据名称和参数类型覆盖基类的虚函数(参见下文).因此,你的类C有两个虚函数foo,一个从每个A和B继承.但函数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 member function vf with the same name,parameter-type-List,cv-qualification,and ref-qualifIEr (or absence of same) as Base::vf is declared,then Derived::vf is also virtual (whether or not it is so declared) and it overrIDes Base::vf.

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

When the declarator-ID is qualifIEd,the declaration shall refer to a prevIoUsly declared member of the class or namespace to which the qualifIEr refers […]”

因此任何虚拟的空虚X :: foo();作为C内部的声明是非法的.

代码

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

是AFAIK覆盖foo的唯一方法,它将覆盖A :: foo和B :: foo.对于A :: foo和B :: 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();}
总结

以上是内存溢出为你收集整理的C从具有相同虚函数名称的多个基类继承全部内容,希望文章能够帮你解决C从具有相同虚函数名称的多个基类继承所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1209832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存