Код: Выделить всё
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]