C++ 重写不共享公共接口的基类的虚函数 #包括 结构B1 { 虚空方法()=0; 虚拟~B1(){} }; 结构B2 { 虚空方法()=0; 虚拟~B2(){} }; 结构D:B1、B2 { 虚空法() { std::cout
afaik这在所有标准中都是合法的。我不确定它是否有自己的特殊名称,但它类似于 如果重写D中的“虚空方法()”,则重写B1和B2中的方法 编辑: 要了解为什么没有“在D:B1::method和B2::method中有两个不同的独立继承虚拟函数”: 重写方法时,只能指定函数名、返回类型和参数,但不能添加有关重写时从哪个函数继承的签名详细信息 想象一下这是可能的,然后它可能看起来像这样:C++ 重写不共享公共接口的基类的虚函数 #包括 结构B1 { 虚空方法()=0; 虚拟~B1(){} }; 结构B2 { 虚空方法()=0; 虚拟~B2(){} }; 结构D:B1、B2 { 虚空法() { std::cout,c++,overriding,virtual,multiple-inheritance,C++,Overriding,Virtual,Multiple Inheritance,afaik这在所有标准中都是合法的。我不确定它是否有自己的特殊名称,但它类似于 如果重写D中的“虚空方法()”,则重写B1和B2中的方法 编辑: 要了解为什么没有“在D:B1::method和B2::method中有两个不同的独立继承虚拟函数”: 重写方法时,只能指定函数名、返回类型和参数,但不能添加有关重写时从哪个函数继承的签名详细信息 想象一下这是可能的,然后它可能看起来像这样: #include <iostream> struct B1 { virtual void m
#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;
}
你不能指定你调用的是哪一个。因此,即使有一种方法可以重载这两个函数,在函数调用中仍然存在区分的问题
编辑:
“无法指定要调用的方法。”指的是,您无法指定是要调用B2::method的类D重载还是B2方法本身。objectD.B2::method将始终调用B2(未重载)方法(在本例中,由于B2没有实现,因此不会编译该方法)您的代码格式正确:
void D::method()
同时覆盖void B1::method()
和void B2::method()
本规范规定(C++11§10.3/2):
如果虚拟成员函数vf
在类Base
和类Derived
中声明,直接或间接地从Base
派生,则成员函数vf
具有相同的名称、参数类型列表、cv限定符和ref限定符(或没有相同的限定符)由于声明了Base::vf
,那么Derived::vf
也是虚拟的(无论是否声明),并且它覆盖了Base::vf
B1
声明一个虚拟成员函数void B1::method()
。ClassD
派生自B1
,它还声明一个具有相同名称(method
)、相同参数列表(无参数)、相同cv限定(无限定)和相同ref限定符的成员函数(无资格)
因此,void D::method()
覆盖了void B1::method()
同样的逻辑适用于
void B2::method()
(在上面的解释中,只需将B2
替换为B1
),因此void D D::method()
覆盖void B1::method()
和void B2::method()
谢谢,我明白了。我想知道更多的细节,因为这让我有点惊讶。@James McNellis这不是只能在类成员内部实现吗?我明白了。尽管如此,它们还是会调用基类函数,而不考虑重载。“想象一下,这是可能的,然后它可以看起来像这样:”然后你得到一个函数名为“代码> B1::方法<代码>::B1::方法< /Calp>!但是在C++ <代码>::B1<代码>意味着代码> B1 < /代码>当函数的不合格名称<代码> B1::方法< /C> >,你知道有问题。因此,即使有一种方法可以同时重载这两种方法,“这也不会是重载,因为函数有不同的名称:B1::method
vsB2::method
!你可以想试多少就试多少,我只是认为你无法实现这个想法。(但尝试很有趣。)如果你解释一下是什么导致你认为这是一个特例,有人可能会找到一个很好的解释。因为在这种情况下,我希望在D:B1::method和B2::method中有两个不同的独立继承虚拟函数。谢谢,听起来是真的。我在C++03和C++98中发现了类似的项。但是,我很好奇,sta中是否有一些添加这种情况的标准?可能是多重继承的一些特殊注释?除了“and ref限定符”,我希望C++98和C++03中的规范是相同的。很好,很高兴知道。顺便说一下,只需使用method()如果D是通过基类引用/指针访问的,则不重写它只允许D。比较您的解释是有意义的,但它仍然令人惊讶。相同的代码体同时实现两个不同的方法,因为B1::method和B2::method肯定是不相关的。如果我对每一件令人惊讶的事情都有一美元,我会赢得了关于C++…嗯,我会有很多美元。
struct D: B1, B2
{
virtual void B1::method()
{
std::cout << "D::method\n";
};
virtual void B2::method()
{
std::cout << "D::method\n";
};
};
objectD.method()