Zugriff auf ein Mitglied eines untergeordneten Objekts, wenn es sich in einem Basisvektor befindet [Duplikat]

Jan 20 2021

Ich habe derzeit Probleme beim Zugriff auf ein Mitglied eines untergeordneten Objekts, wenn es sich in einem Basisvektor befindet. Ich weiß, dass es sich um ein Objekt-Slicing-Problem handelt. Ich versuche, dynamisches Casting zu verwenden, bin aber ein Anfänger und bin mir hinsichtlich der Syntax oder der Verwendung nicht sicher es wäre jede Hilfe Pseudocode dankbar:

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

Antworten

Jeffrey Jan 20 2021 at 07:47

Die erste Technik besteht darin, sich auf virtuelle Funktionen zu verlassen:

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

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

Dann items[0]->doStuff()wird die abgeleitete Version aufgerufen.

Die zweite Technik ist das Niederwerfen:

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

Dadurch erhalten Sie entweder einen nullptroder Ihren abgeleiteten Objektzeiger. Das Problem ist, dass Sie eine virtuelle Funktion hinzufügen müssen, damit dies funktioniert.