afgeleide klassenaanwijzer toewijzen aan basisklasseaanwijzer in C++

afgeleide klassenaanwijzer toewijzen aan basisklasseaanwijzer in C++

myfunc moet toegankelijk zijn vanuit de basisklasse, dus je zou een openbare virtuele myfunc . moeten declareren in base . Je zou het puur virtueel kunnen maken als je van plan bent voor base om een ​​abstracte basisklasse te zijn, d.w.z. een die niet kan worden geïnstantieerd en als een interface fungeert:

class base
{
 public:
  virtual void myfunc() = 0; // pure virtual method
};

Als u base . wilt kunnen instantiëren objecten, dan zou je een implementatie moeten geven voor myfunc :

class base
{
 public:
  virtual void myfunc() {}; // virtual method with empty implementation 
};

Er is geen andere schone manier om dit te doen als u toegang wilt tot de functie van een aanwijzer naar een basisklasse. De veiligste optie is om een ​​dynamic_cast . te gebruiken

base* pbase = new derived;

....
derived* pderived = dynamic_cast<derived*>(pbase);
if (derived) {
  // do something
} else {
  // error
}

Als je onvermurwbaar bent dat deze functie GEEN onderdeel van base zou moeten zijn, heb je maar 2 opties om het te doen.

Gebruik een verwijzing naar een afgeleide klasse

derived* pDerived = new derived();
pDerived->myFunc();

Of (lelijker &hevig ontmoedigd ) static_cast de aanwijzer naar het afgeleide klassetype en roep vervolgens de functie aan
OPMERKING :met de nodige voorzichtigheid te gebruiken . Alleen gebruiken als u ZEKER bent van het type aanwijzer dat u cast, d.w.z. u weet zeker dat pbase is een derived of een type afgeleid van derived . In dit specifieke geval is het oké, maar ik vermoed dat dit slechts een voorbeeld is van de daadwerkelijke code.

base* pbase = new derived();
static_cast<derived*>(pbase)->myFunc();

Om de basisklasse-aanwijzer te gebruiken, moet u moeten verander de definitie van de basisklasse in:

class base
{
public:
    virtual void myFunc() { }
};

Ik zie er geen andere manier omheen. Sorry.