вызывать виртуальную функцию без создания какого-либо объекта только через указатель типа класса? - PullRequest
0 голосов
/ 03 января 2019

Я хочу понять, как работает следующая программа.

class A{
    public:
    virtual void fun();
};

void A:: fun()
{
    cout << "fun() called";
}

int main() {

    A *ptr_a;
    ptr_a->fun();
    return 0;
}

Она не печатает "fun () звонил".Я пытался найти разумное объяснение этому, но не смог.Если я удаляю виртуальную из декларации, то она работает нормально.Также нет ошибки времени выполнения.

1 Ответ

0 голосов
/ 03 января 2019

Нет причин ожидать, что это сработает, и нет причин ожидать, что это не сработает.

Вы вызываете функцию для несуществующего объекта через неинициализированный и недействительный указатель.

Все может случиться.

Все.

На практике вы не увидите больших результатов виртуальной отправки, поскольку они основаны на данных, хранящихся в несуществующем объекте, тогда как обычный вызов функции проще и может "просто произойти" без необходимости действительно разыменовываем указатель.

Но на самом деле это не так, потому что компиляторы сложны, и все предполагаемое значение (независимо от того, что это такое в программе с неопределенным поведением !) Может быть легко потеряно из вашего кода в процессе перевода и оптимизация.

Язык, который немного меньше заботится о том, чтобы «платить за то, что я не использую», может сделать это серьезной ошибкой, но это не так, как работает C ++.

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