Я читаю Мышление на С ++ Брюса Экеля. В главе 15 (том 1) под заголовком « Поведение виртуальных функций внутри конструктора » он выходит
Что произойдет, если вы находитесь внутри
конструктор и вы называете виртуальный
функционировать? Внутри рядового члена
функция, которую вы можете себе представить, что будет
случилось - виртуальный звонок разрешен
во время выполнения, потому что объект не может
знать, принадлежит ли он к классу
функция-член находится в, или некоторые
класс, производный от него. За
последовательность, вы можете подумать, что это
что должно происходить внутри
Конструкторы.
Здесь Брюс пытается объяснить, что когда вы вызываете виртуальную функцию внутри конструктора объекта, полиморфизм не проявляется, то есть функция текущего класса будет вызываться только и не будет какой-либо другой производной версией класса этой функции. Это верно, и я могу это понять, так как конструктор для класса не будет знать заранее, работает ли он для него или для создания какого-либо другого объекта. Более того, если это так, то это будет вызывать функции для частично созданного объекта, что губительно.
Хотя моя путаница внезапно возникла из-за первого предложения, в котором он заявляет об обычной функции-члене, где он говорит, что виртуальный вызов будет разрешен во время выполнения. Но подождите, внутри любой функции-члена класса, когда вы вызываете другую функцию (виртуальную или не виртуальную), будет вызываться только ее собственная версия класса, верно? Э.Г.
class A
{
virtual void add() { subadd(); }
virtual subadd() { std::cout << "A::subadd()\n"; }
};
class B : public A
{
void add() { subadd(); }
void subadd() { std::cout << "B::subadd()\n"; }
};
В приведенном выше коде, в A::add()
, когда сделан вызов на subadd()
, он будет всегда вызывать A::subadd()
, и то же самое верно и для B
, верно? Так что он имеет в виду, когда «виртуальный вызов разрешается во время выполнения, потому что объект не может знать, принадлежит ли он классу, в котором находится функция-член, или некоторому классу, производному от него»? *
Он объясняет это относительно вызова через указатель базового класса ? (Я действительно так подозреваю). В этом случае он не должен писать «Внутри обычной функции-члена»; насколько я понимаю, любой вызов функции-члена из другой функции-члена того же класса не является полиморфным, пожалуйста, исправьте меня, если я ошибаюсь.