Виртуальная функция не переопределяет последний объект наследования - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 3 класса: A , B , C . B наследуется от A , а C наследуется от B (поэтому C является внуком A).
Каждый объект имеет функцию talk () , которая отображает текст, в A и B , это виртуально.
Позвольте иметь снаружифункция вызов ( A & a) , который принимает объект A по ссылке и вызывает функцию talk () .
отправка объекта C для функции, она использует talk () из B вместо C , даже в B talk () является виртуальным.
Почему это так?Как заставить его вызывать версию из C ?

    #include <iostream>
    using namespace std;

    class A {
    public:
        virtual void talk() = 0;
        virtual void say() = 0;
    };

    class B : public A  {
    public:
        virtual void talk() // Why C does not overrides this?
        {   cout << "hello\n";  }   
    };

    class C : public B  {
    public:
        void talk (int a)   // It should override B.talk();
        { cout << "bye\n";}
        virtual void say()  { cout << "my name\n"; }
    };

    void call(A &a) {
        a.talk();   // Why does it call virtual talk() from B rather than from C?
        a.say();    // This was found so it knows about object C
    }

    int main()  {
        C c;
        call(c);
        system("PAUSE");
        return 0;
    }

Я ожидаю, что вызов (A & a) принимает самую дальнюю версию наследования, если каждый класс между виртуальный разговор ()

1 Ответ

1 голос
/ 03 мая 2019

В вашем примере C.talk(int) не переопределяет B.talk(), потому что C.talk принимает в качестве параметра int, так что это совершенно другая функция.

Вы можете добавить override после объявления функции, чтобы компилятор проверил, переопределяет ли он что-либо:

class C : public B  {
   public:
    // Here, the compiler complains because there's no talk(int) method
    // That it can override
    void talk (int a) override;
    { cout << "bye\n";}
    virtual void say()  { cout << "my name\n"; }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...