#include <iostream>
struct A {
void init()
{
internal_init();
}
virtual void internal_init()
{
std::cout << "internal of A" << std::endl;
}
};
struct B: public A {
void internal_init()
{
init();
std::cout << "internal of B" << std::endl;
}
};
int main(){
B instance;
std::cout << "internal of A" << std::endl;
instance.internal_init();
return 0;
}
Сначала программа отправляется B::internal_init()
, как и ожидалось. Затем, до A::init()
(думаю, так как B происходит от A, а B не имеет init()
). Теперь что?вызов виртуального метода без указания на объект?
какой internal_init()
он выберет? поскольку он идет до B::internal_init()
, программа войдет в бесконечный цикл, и я не понимаю, почему.
- Что происходит, когда я звоню
internal_init()
? - Почему он вызывает
internal_init()
пользователя "B part" экземпляра? Это о «виртуальном»? Если да, то как получилось? Виртуальные функции имеют место, когда мы используем полиморфизм (который, как и начинающий, как и я, понимает, работает с указателями базового класса, которые указывают на объекты производного класса).
Обратите внимание, что ** ** первый звоните в 'internal_init' является не полиморфный. Но внутри 'init()' вызов * является * полиморфным, потому что (невидимый) указатель 'this' всегда является указателем ... Если вы хотите этого избежать, вам нужно написать' A :: internal_init() '(тем самым вызывая неполиморфный вызов) в 'init'. – leemes
Это действительно хороший пример кода, который вы получили здесь. Он демонстрирует, что ** полиморфные вызовы могут быть скрыты за неполиморфными вызовами **. Это необходимо для написания не виртуальных «шаблонных методов» (в смысле [шаблон шаблона «метод шаблона»] (https: //en.wikipedia.org/wiki/Template_method_pattern), чтобы не путать с шаблонами C++). Там не виртуальная функция вызывает виртуальные подфункции, которые реализуют детали более масштабного алгоритма. Эти детали могут быть реализованы в подклассах, тогда как алгоритм большего масштаба фиксируется базовым классом. – leemes