Виртуальное наследование: нет подходящей функции для вызова - PullRequest
0 голосов
/ 24 июня 2018

У меня есть следующий код.Этот код служит для

#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 Ответ

0 голосов
/ 25 июня 2018

Когда вы перегружаете унаследованную функцию в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...