2012-11-01 103 views
1

如果我創建基類指針數組,請在作用域中創建派生類對象,並將引用傳遞給數組,並在派生類中調用派生類的虛函數範圍正確但超出範圍,我嘗試調用虛函數,它忘記它是派生類。我試圖鑄造它,但它不起作用。指向派生類的基類指針,範圍之外

class Base{ 
    public: 
     Base(string str) {name = str;} 
     virtual string toString() { return name;} 
     Base& operator=(const Base& b) {name = b.name; return *this;} 
    private: 
     string name; 
}; 
class Derived: public Base{ 
    public: 
     Derived(string str1, string str2) {name = str1; second = str2;} 
     virtual string toString() {return name + second;} 
     Derived& operator=(const Derived& d) {Base::operator=(d); 
               second = d.second; return *this;} 
    private: 
     string name; 
     string second; 
}; 
int main(){ 
    Base* baseArr[5]; 
    int n; 
    cin >> n; 
    if(n==1){ 
     Derived der("Derived", "Class"); 
     baseArr[0] = &der; 
     baseArr[0]->toString() << endl; //this prints out "DerivedClass" 
    } 
    cout << baseArr[0]->toString(); //this prints out "Derived" 
} 

有沒有辦法在範圍之外調用派生類的函數?

回答

1

您正在調用未定義的行爲,因爲您指的是已通過baseArr[0]銷燬的對象實例。 der的生命週期在}的範圍末尾不存在,並且不能通過在該點之後存儲的指針來引用它。

+0

那麼,有沒有什麼辦法可以保存der過去的? –

+0

當然,將它的聲明移到'if(...){'範圍外,那麼它的生命週期將延伸到'main()'中的最後'}'。 –

+0

但是,我需要如果聲明我的實際代碼。因爲我試圖創建2個不同的派生類。如果條件爲真,則爲Derived1;如果爲false,則爲Derived2,兩者都從Base繼承。 –

相關問題