доступ к члену дочернего объекта, когда он находится в базовом векторе [дубликат]

Jan 20 2021

В настоящее время у меня возникают проблемы с доступом к члену дочернего объекта, когда он находится в базовом векторе, я знаю, что это проблема нарезки объекта, я пытаюсь использовать динамическое приведение, но я новичок и не совсем уверен в синтаксисе или в том, как использовать это, любая помощь будет оценена псевдокодом:

class Base {}

Class Derived : public base {

bool A

}

std::vector<Base*> items;

Item* i = new Derived(constructor);

items.push_back(i);

// items[0]->A isnt accessible due to object slicing

Ответы

Jeffrey Jan 20 2021 at 07:47

Первый способ - полагаться на виртуальные функции:

class Base 
{
    public:
    virtual int doStuff();
}

Class Derived : public base 
{
    public:
    virtual int doStuff();
}

Затем items[0]->doStuff()вызовет производную версию.

Второй прием - понижать:

dynamic_cast<Derived*>(items[0]);

Это даст вам либо nullptrуказатель на производный объект, либо указатель на него. Проблема в том, что вам нужно добавить виртуальную функцию, чтобы это работало.