Механизм работы наследования с++

У меня вопрос про механизм работы наследования. Когда мы наследуем классы, друг от друга, то один класс получает доступ к членам другого класса, но это очень упрощенно. Меня интересует более точное определение происходящего при наследовании. Сейчас поясню, что натолкнуло меня на эту мысль. Есть 2 класса:

class Parent
{
};

class Child : public Parent
{
public:
    void say() 
    {
        cout << "I am child";
    }
};

Теперь, самое главное, что меня интересует:

int main()
{
    Parent variable = Child();
}

Почему работает данная запись и все прекрасно компилируется? Теперь другой момент, если я попытаюсь сделать вот-так:

variable.say();

То у меня ничего не получится, хотя казалось бы, в variable лежит объект класса Child, а Child в свою очередь имеет метод say, но вызвать я его не могу, как так? Объясните пожалуйста, что происходит при наследовании одного класса от другого, явно в класс наследник не просто копируются члены класса-родителя, а это происходит как-то по другому, как?


Ответы (1 шт):

Автор решения: Harry

Как бы это выразиться...

Parent variable = Child();

скопируется только та часть Childа, которая соответствует Parent. Почему компилируется? Ну, поскольку Child является одновременно Parent... :)

Объект variable - это просто объект типа Parent, со всеми вытекающими последствиями.

Заметим, что вы не сможете также сделать

Parent * variable = new Child;
variable->say();

по той же самой причине - variable - это указатель на Parent, а никакого say() у Parent нет. Ни обычного, ни вирптуального.

→ Ссылка