首页 > 解决方案 > 虚拟继承:没有匹配的调用函数

问题描述

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

#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->m1(1)能够解决,B::m2(int a)但显然我的代码是错误的。

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

标签: c++inheritancevirtual

解决方案


在 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;
}

推荐阅读