Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重写不共享公共接口的基类的虚函数 #包括 结构B1 { 虚空方法()=0; 虚拟~B1(){} }; 结构B2 { 虚空方法()=0; 虚拟~B2(){} }; 结构D:B1、B2 { 虚空法() { std::cout_C++_Overriding_Virtual_Multiple Inheritance - Fatal编程技术网

C++ 重写不共享公共接口的基类的虚函数 #包括 结构B1 { 虚空方法()=0; 虚拟~B1(){} }; 结构B2 { 虚空方法()=0; 虚拟~B2(){} }; 结构D:B1、B2 { 虚空法() { std::cout

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

afaik这在所有标准中都是合法的。我不确定它是否有自己的特殊名称,但它类似于

如果重写D中的“虚空方法()”,则重写B1和B2中的方法

编辑:

要了解为什么没有“在D:B1::method和B2::method中有两个不同的独立继承虚拟函数”:

重写方法时,只能指定函数名、返回类型和参数,但不能添加有关重写时从哪个函数继承的签名详细信息

想象一下这是可能的,然后它可能看起来像这样:

#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()
。Class
D
派生自
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
vs
B2::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()