2016-12-02 5 views
3

In dem unter C++ Code mit virtuellen FunktionenVirtuelle Funktion in C++

#include<iostream> 
using namespace std; 
class Base{ 
    public: 
    virtual void fun(){ 
     cout << "Base::fun()called \n"; 
    } 

}; 

class Child : public Base { 
    public: 
    void fun() { 
     cout << "Child::fun() called\n"; 
    } 

    void door(){ 
     cout << "Child::door() called \n"; 
    } 
}; 


int main(){ 

    Base *base_ptr = new Child(); 
    base_ptr->fun(); 
    return 0; 
} 

Wie kann ich Tür Funktion base_ptr berufen? Diese Frage wurde in einem Interview gestellt. Ich habe mich gefragt, ob es

Vielen Dank für Ihre Antworten

+0

In 'virtual void Tür() = 0;' Sie Klassendeklaration für 'Base'. Oder kannst du Base nicht verändern? – drescherjm

+0

@drescherjm. Nein, du kannst die Basis nicht ändern – Zaks

+0

Du weißt, vielleicht war es nur eine Trickfrage, um herauszufinden, wie du reagierst, wenn du OOP und Klassen so falsch benutzt siehst. –

Antwort

6

möglich sein kann (vorausgesetzt, dass Base und Child nicht geändert werden kann.)

Sie static_castbase_ptr-Child* umwandeln können. tatsächlich zeigt auf eine Child Instanz

static_cast<Child*>(base_ptr)->door() 

Dies ist sicher, solange Sie sicher dass base_ptr sind.


Wenn Sie nicht wissen, was Instance-Typ abgeleitet base_ptr zu zeigt, betrachten dynamic_cast mit:

if(auto child = dynamic_cast<Child*>(base_ptr)) 
{ 
    child->door(); 
} 

Es sei denn, der Compiler aggressiv verwaltet, es zu optimieren, dynamic_cast hat Kopf zusätzliche Laufzeit im Vergleich zu static_cast .

+4

'dynamic_cast' könnte besser geeignet sein. –

+1

@FredLarson: Es gibt keinen Grund, 'dynamic_cast' in dieser speziellen Situation zu verwenden. –

+3

@VittorioRomeo: Sie haben in Ihrer Antwort auf den Grund selbst hingewiesen, damit 'static_cast' gültig ist," müssen Sie sicher sein, dass 'base_ptr' tatsächlich auf eine' Child'-Instanz verweist. " Mit 'dynamic_cast' können Sie feststellen, ob dies der Fall ist. –

0

Da Base keine door() Methode hat, können Sie nicht einfach base_ptr->door() anrufen.

Wenn Sie jedoch wissen base_ptr ein Child ist, können Sie es gegossen und dann rufen door()

Child* child_ptr = static_cast<Child*>(base_ptr); 
child_ptr->door(); 
Verwandte Themen