Я читаю Thinking in C++ от Bruce Eckel. В главе 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
, а, верно? Итак, что он подразумевает под «виртуальным вызовом, разрешен во время выполнения, потому что объект не может знать, принадлежит ли он классу, в котором находится функция-член, или какой-то класс, полученный из него»?
Объясняет ли он это в отношении вызова с помощью указателя базового класса? (Я действительно так подозреваю). В этом случае он не должен писать «Внутри обычной функции-члена»; из моего понимания до сих пор любой вызов функции-члена изнутри другой функции-члена того же класса не является полиморфным, пожалуйста, исправьте меня, если я ошибаюсь.
Теперь это хороший пример для «просто попробуйте». – MSalters
Я пробовал перед публикацией и показывает только соответствующие функции-члены, как я уже писал выше. – legends2k
Если вы хотите, чтобы B был получен из A, вы не сказали компилятору. –