Почему вызывается метод родителя?

#include <iostream>
#include <vector>
using namespace std;


class rod{
    public:
    virtual void get_name(){
        
        cout << "rod" << endl;
    }
    void del(){
        cout << "rod" << endl;
    }
    void getChild(){
    } 
    void add_child(rod r){
        childs.push_back(r);
    }
    vector <rod> childs;
};

class child : public rod{
    public:
    void get_name(){
        
        cout << "child" << endl;
    }
    void del(){
        cout << "child" << endl;
    }

};

int main()
{
    rod rod;
    rod.get_name();
    child child;
    child.get_name();
    rod.add_child(child);
    
    rod.childs[0].get_name();

    return 0;
}

Классы в разных файлах


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

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

У вас

vector <rod> childs;

т.е. элементы класса - rod. Когда вы добавляете child -- это уже некорректно, так как происходит срезка. И добавляется именно rod. Кстати, срезка происходит уже при вызове void add_child(rod r) - так как передача выполняется по значению...

Как вариант - вектор указателей

void add_child(rod& r)
{
    childs.push_back(&r);
}
vector<rod*> childs;

...

rod.add_child(child);
rod.childs[0]->get_name();

Ну, или через обертку ссылки:

void add_child(rod& r)
{
    childs.push_back(r);
}
vector<reference_wrapper<rod>> childs;

...

rod.add_child(child);
rod.childs[0].get().get_name();
→ Ссылка