Joh*_*ohn 13 c++ virtual overriding multiple-inheritance
#include <iostream>
struct B1
{
virtual void method()=0;
virtual ~B1(){}
};
struct B2
{
virtual void method()=0;
virtual ~B2(){}
};
struct D: B1, B2
{
virtual void method()
{
std::cout << "D::method\n";
};
};
int main(int argc,char *argv[])
{
D d;
B1 &b1=d;
B2 &b2=d;
b1.method();
b2.method();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意,B1和B2不共享通用接口.
这合法吗?如果是 - 在哪个标准?C++ 98/03/11?
msvc和gcc都编译好了.
以前我想过,我必须使用一些通用接口来处理这种情况(可能的虚拟继承).
这种情况有什么特别的名字吗?
请问它的工作原理如何?也许一些ISO参考?
您的代码格式正确: void D::method()覆盖void B1::method()和void B2::method().
规范陈述(C++11§10.3/ 2):
如果虚拟成员函数
vf在类Base和类中声明Derived,直接或间接地从具有相同名称Base的成员函数派生vf,参数类型列表,cv限定和ref-qualifier(或不存在相同)Base::vf声明,然后Derived::vf也是虚拟的(无论是否声明)并覆盖它Base::vf.
B1声明一个虚拟成员函数void B1::method().类D派生自B1并且它还声明了具有相同名称(method),相同参数列表(无参数),相同cv资格(无资格)和相同ref-qualifier(无资格)的成员函数.
因此,void D::method()覆盖void B1::method().
相同的逻辑适用于void B2::method()(只是替换B2为B1在上述的说明),因此void D::method()将覆盖这两个void B1::method()和void B2::method().
| 归档时间: |
|
| 查看次数: |
3996 次 |
| 最近记录: |