2013-03-10 9 views
9

Ho una classe base e una classe figlio estendendola. La classe figlio ha il suo metodo interno che la classe genitore non ha. Cioè, dichiararlo come virtuale nella classe base non è davvero un'opzione.Come chiamare il metodo figlio da un puntatore genitore in C++?

class A { 
    public: 
    virtual void helloWorld(); 
}; 

class B : public A { 
    public: 
    virtual void helloWorld(); 
    void myNewMethod(); 
}; 

Poi, nella mia implementazione, ho un puntatore ad A e ho costruito come B:

// somewhere in a .cpp file 
A* x; 
x = new B(); 
x->myNewMethod(); // doesn't work 

La mia soluzione attuale è quella di lanciarlo:

((B *)x)->myNewMethod(); 

La mia domanda è, c'è un modo più pulito per farlo, o è il modo di andare?

risposta

11

La mia domanda è, c'è un modo più pulito per farlo, o è il modo di andare?

Un cast in fase di esecuzione sembra essere OK in questo caso. Tuttavia, invece di C-stile getta, è necessario utilizzare dynamic_cast<> (nel caso in cui non si è sicuri se x punti effettivamente a un oggetto di tipo di B):

B* pB = dynamic_cast<B*>(x); // This will return nullptr if x does not point 
          // to an object of type B 
if (pB != nullptr) 
{ 
    pB->myNewMethod(); 
} 

D'altra parte, se si è certi che x punta a un oggetto di tipo B, quindi si dovrebbe utilizzare static_cast<>:

B* pB = static_cast<B*>(x); 
pB->myNewMethod(); 
1

A non definisce alcun metodo chiamato myNewMethod(), quindi non può richiamarlo.

Anche se normalmente sconsiglio vivamente di eseguire il cast, ecco che il casting è l'unico modo.

0

Beh, dovrete lanciare ma si può fare il pulitore codice di sguardo/più leggibile nascondendo la sintassi fusione brutto in una funzione .

B* B_static_cast(A* item) 
{ 
    return static_cast<B*>(item); 
} 

A* item = new B(); 
B_static_cast(item)->funtion_in_B(); 
Problemi correlati