C ++ Не виртуальный вызов функции при виртуальном вызове - PullRequest
1 голос
/ 21 марта 2020

Почему вывод этой программы "КЛАСС А"? Разве это не относится к типу B? Разве это не значит, что this-> g () должен вызывать версию g класса B?

#include <iostream>

using namespace std;

class A {
private:
    void g() {
        cout << "CLASS A" << endl;
    }
public:
    virtual void f() {
        g();
    }
};

class B : public A {
public:
    void g() {
        cout << "CLASS B" << endl;
    }
};

int main() {
    A* a = new B();
    a->f();
}

1 Ответ

1 голос
/ 21 марта 2020

Разве это не относится к типу B?

Нет. B может быть динамическим c типом, но тип *this stati *1006* во всех своих функциях-членах равен A.

Функция-член g не является виртуальной, поэтому поэтому при обращении к нему используется stati c привязка. При связывании stati c тип объекта Dynami c не имеет значения - имеет значение только тип stati c. Вызов невирусной g в функции-члене A должен быть вызовом A::g.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...