Разные функции? - PullRequest
       32

Разные функции?

0 голосов
/ 13 ноября 2018

Итак, вот пример кода. Задача состояла в том, чтобы дать вывод, что этот код будет распечатан. Это 2 разные функции? Что же тогда происходит с vtable в классе B? Он просто хранит 2 указателя на 2 разные функции с одинаковым именем?

#include<iostream>
#include <vector>
using namespace std;
class A
{
public:
    A()
    {
        init();
    }
    virtual void init(bool a = true)
    {
        if(a)
            cout << "A" << endl;
    }
};
class B :public A
{
public:
    virtual void init()
    {
        cout << "B" << endl;
    }
};

int main()
{
    B b;
    A* a = &b;
    a->init();
    a->init(true);
    system("pause");
}

Не могу найти, где почитать об этом деле. Не могли бы вы, товарищи, объяснить или дать ссылку на какой-нибудь источник, если вы видели этот случай?

1 Ответ

0 голосов
/ 13 ноября 2018

Это были уже две разные функции (переопределение не меняет этого), но поскольку они имеют разную подпись, то в B не не переопределяет в A.

Помните, что имя функции является лишь частью ее идентичности!Его список параметров тоже имеет значение.

Если бы вы поставили ключевое слово override на B::init(), тогда ваша программа не смогла бы скомпилироваться, потому что B::init() на самом деле ничего не перезаписывает (нет init() (виртуально или иным образом, в своей базе).

С виртуальной таблицей действительно ничего не происходит, что также не произошло бы, если бы две функции буквально имели разные имена, такие как A::init(bool) и B::urgleburgleboop().

Обратите внимание, что, помимо virtual, полиморфизма и переопределения, B::init() также "скрывает" A::init(bool) для нормального разрешения перегрузки (спасибо, C ++!), И из-за этого Clang будет предупреждать васcode.

Что касается того, где вы можете прочитать об этом, ваша книга по C ++ будет хорошим началом.:)

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