代码之家  ›  专栏  ›  技术社区  ›  zython Hiery Nomus

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

  •  0
  • zython Hiery Nomus  · 技术社区  · 6 年前

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

    #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) 但显然我的代码是错误的。

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

    1 回复  |  直到 5 年前
        1
  •  3
  •   j b    5 年前

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