"Я уверен, что есть десятки вопросов с одним и тем же названием. Многие из них дублируются. Моя может быть дублирована, но я не мог ее найти. Поэтому я стараюсь сделать ее очень аккуратной, короткой и простой."
У меня есть такая иерархия:
class Shape {
public:
virtual void virtualfunc() { std::cout << "In shape\n"; }
};
class Circle: public Shape {
public:
void virtualfunc() { std::cout << "In Circle\n"; };
};
и когда я использую классы с помощью указателя, функции вызываются так, как я ожидал:
int main() {
Shape shape_instance;
Shape* ref_shape = &shape_instance ;
Circle circle_instance;
Circle* ref_circle = &circle_instance;
ref_shape = dynamic_cast<Shape*> (ref_circle);
ref_shape->virtualfunc();
}
Здесь программа вызывает virtualfunc()
производного класса, и результат естественно: In Circle
Теперь я хочу избавиться от указателей, вместо этого использовать ссылки и получить тот же результат. Поэтому я делаю тривиальные изменения в main()
, чтобы выглядеть так:
int main() {
Shape shape_instance;
Shape& ref_shape = shape_instance;
Circle circle_instance;
Circle& ref_circle = circle_instance;
ref_shape = dynamic_cast<Shape&>(ref_circle);
ref_shape.virtualfunc();
}
Но на этот раз программа вызывает virtualfunc()
базового класса, а результат: In Shape
Я ценю, если вы сообщите мне, какую концепцию ссылок мне не хватает, и как изменить ссылки в main(), чтобы получить результат, который я получил в версии указателя.
Благодарю вас