虚拟继承:没有匹配的调用函数

Posted

技术标签:

【中文标题】虚拟继承:没有匹配的调用函数【英文标题】:Virtual inheritance: No matching function for call to 【发布时间】:2018-06-24 20:54:29 【问题描述】:

我有以下代码。此代码的目的是

#include <stdio.h>
#include <iostream>
struct A 
    public:
        virtual void m1()
            std::cout << "A virtual void m1"<<std::endl;
        
        void m1(int a)
            std::cout << "A void m1(int)"<<std::endl;
        
        virtual void m2()
            std::cout << "A virtual void m2()"<<std::endl;
        
        void m3(int a)
            std::cout << "A void m3(int)"<<std::endl;
        
;
struct B: virtual  A
    public:
    B():A()
    virtual void m1()
        std::cout <<"B virtual void m1()" <<std::endl;
    
    virtual void m2(int a)
        std::cout << "B virtual void m2(int a)"<<std::endl;
    
    void m3()
        std::cout <<"B void m3" <<std::endl;
    
    virtual void m4()
        std::cout <<"B void m4()" <<std::endl;
    
;



int main() 
    B* b = new B;

    b->m1();
    b->m1(1);
    b->m2();
    b->m3(1);

    return 0;

当我尝试编译上述代码时,出现以下错误:

$ c++ virtual.cpp
virtual.cpp: In function ‘int main()’:
virtual.cpp:90:12: error: no matching function for call to ‘B::m1(int)’
     b->m1(1);
            ^
virtual.cpp:21:18: note: candidate: ‘virtual void B::m1()’
     virtual void m1()
                  ^~
virtual.cpp:21:18: note:   candidate expects 0 arguments, 1 provided
virtual.cpp:91:11: error: no matching function for call to ‘B::m2()’
     b->m2();
           ^
virtual.cpp:24:18: note: candidate: ‘virtual void B::m2(int)’
     virtual void m2(int a)
                  ^~
virtual.cpp:24:18: note:   candidate expects 1 argument, 0 provided
virtual.cpp:92:12: error: no matching function for call to ‘B::m3(int)’
     b->m3(1);
            ^
virtual.cpp:27:10: note: candidate: ‘void B::m3()’
     void m3()
          ^~
virtual.cpp:27:10: note:   candidate expects 0 arguments, 1 provided

在阅读了有关虚函数的内容后,例如,我希望我的调用 b-&gt;m1(1) 能够解析为 B::m2(int a),但显然我的代码是错误的。

我怀疑我没有正确初始化父结构,但除了我不知道我做错了什么之外。

【问题讨论】:

B 中名为m1 的成员隐藏了A 中的所有同名成员。要公开它们,请在 B 正文的任何​​位置添加此行:using A::m1;,其他成员也是如此。 using A::m1 是否有一个“catch all”语句,所以我会公开每个非显式覆盖的函数? @zython:你自动拥有它。如果派生类没有覆盖m1,则不会隐藏基类重载。只有您在派生类中定义的名称(无论是否为虚拟)才会隐藏基类成员。 所以没有机制(例如使用类)来达到我想要的效果? 为什么要将b-&gt;m1(1) 解析为B::m2(int a)? (注意 m1m2;这是一个错字还是你真的期待这样的结果?) 【参考方案1】:

当您在 C++ 中重载继承函数时,具有相同名称的基类函数会隐藏。隐藏的基类函数不能像类函数那样调用或者不是隐藏的继承函数,需要明确告诉编译器要使用隐藏函数。

你写下定义你想使用的函数的类:theRightClass::ambiguousFunction();

在您的代码中,主要功能变为:

int main() 
    B* b = new B();

    b->m1();
    b->A::m1(1);
    b->A::m2();
    b->A::m3(1);

    delete b;

    return 0;

【讨论】:

以上是关于虚拟继承:没有匹配的调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在使用 C++ 进行虚拟继承期间调用构造函数

指向成员函数的地址是啥,没有虚拟也没有继承

调用非虚拟基方法时,C++ 中的虚拟继承是不是有任何惩罚/成本?

虚拟继承、默认构造函数和额外复制

使用虚拟继承时调用默认构造函数[重复]

C++中的继承和纯虚函数