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 classBase
and in a classDerived
,derived directly or indirectly fromBase
,a member functionvf
with the same name,parameter-type-List,cv-qualification,and ref-qualifIEr (or absence of same) asBase::vf
is declared,thenDerived::vf
is also virtual (whether or not it is so declared) and it overrIDesBase::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从具有相同虚函数名称的多个基类继承所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)