Почему преобразованная переменная использует виртуальную функцию из производного класса C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему преобразованная переменная использует виртуальную функцию из производного класса C++

Сообщение Anonymous »

У меня есть примерно такой код:

Код: Выделить всё

class Person
{
public:
Person(const std::string& name, std::size_t age);

virtual void print() const;
void inc_age() { ++_age; }

private:
std::string _name;
std::size_t _age;
};

class Employee : public Person
{
public:
Employee(const std::string& name, std::size_t age, double salary);

virtual void print() const override;
void add_bonus(double percent);

private:
double _salary;
};

Основное:

Код: Выделить всё

int main()
{
Person mike{"Mike"s, 20};
Employee manager{"Sam"s, 35, 100};

Person* p{&manager};
if (p) p->print(); // this line
std::cout print(), вызывайте сотрудника::print().
Это просто академический интерес (я студент CS), но как чтобы заставить его использовать Person::print() без нарезки (разрезает ли UB?)?
Другой вопрос: наш профессор сказал, что если класс не является полиморфным (не имеет виртуальных функций) Dynamic_cast успешно работает без каких-либо ошибок, молча создавая UB. Правильно ли это и можно ли это предотвратить?
P.S. Извините за мой плохой английский и плохое знание C++. Я изучаю и то, и другое уже довольно давно, но еще не овладел ни одним из них. 

Подробнее здесь: [url]https://stackoverflow.com/questions/79182920/why-upcasted-variable-use-virtual-function-from-derived-class-c[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»