- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
#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;
}
注意,B1 和 B2 不共享公共(public)接口(interface)。
这样合法吗?如果是 - 在哪个标准中? C++98/03/11 ?
msvc 和 gcc 都编译好了。
以前我认为,我必须为这种情况使用一些通用接口(interface)(可能的虚拟继承)。
这种情况有什么特别的名字吗?
请详细说明它是如何工作的?也许是一些 ISO 引用资料?
最佳答案
您的代码格式正确:void D::method()
覆盖 void B1::method()
和 void B2::method( )
.
规范声明(C++11 §10.3/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
.
B1
声明了一个虚成员函数 void B1::method()
。 D
类是从 B1
派生的,它还声明了一个同名的成员函数(method
),同一个参数列表(无参数) , 相同的 cv-qualification(无限定)和相同的 ref-qualifier(无限定)。
因此,void D::method()
会覆盖 void B1::method()
。
同样的逻辑适用于 void B2::method()
(只需将上述解释中的 B2
替换为 B1
即可),所以 void D::method()
覆盖 void B1::method()
和 void B2::method()
。
关于c++ - 重写不共享通用接口(interface)的基类的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11459473/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!