2013-05-15 209 views
1

,所以我有一類叫做調用擴展類功能

class Person{ 

    private: 

    public: 
     Person(); 

} 

和1個多類稱爲患者

class Patient : public Person{ 

    private: 
     string text_; 
    public: 
     Patient(); 
     void setSomething(string text){ text_ = text; } 
} 

現在我已經創造了5人組成的數組一樣

Person *ppl[5]; 

並增加了5名患者像

ppl[0] = new Patient(); 
ppl[1] = new Patient(); 
ppl[2] = new Patient(); 
ppl[3] = new Patient(); 
ppl[4] = new Patient(); 

陣列中的每個關鍵現在我想打電話給setSomething功能從Patient類這樣

ppl[0]->setSomething("test text"); 

,但我不斷收到以下錯誤:

class Person has no member named setSomething 
+0

問題是什麼?編譯器非常清楚哪些是錯誤的。 'Person'沒有'setSomething'方法,所以你不能在'Person'或指向'Person'的指針上調用它。 – juanchopanza

+0

我已經添加了Patient擴展Person,所以我認爲它可以工作... – fxuser

+0

因爲數組的所有元素都是新的患者我可以從Patient類調用一個函數嗎? – fxuser

回答

2

您有一組Person*。您只能在該數組的元素上調用Person的公共方法,即使它們指向Patient對象。爲了能夠撥打Patient方法,您首先必須將Person*轉換爲Patient*

Person* person = new Patient; 
person->setSomething("foo"); // ERROR! 

Patient* patient = dynamic_cast<Patient*>(person); 
if (patient) 
{ 
    patient->setSomething("foo"); 
} else 
{ 
    // Failed to cast. Pointee must not be a Patient 
} 
1

編譯器不知道指針指向Patient對象,所以你必須明確地告訴編譯器,它是:

static_cast<Patient*>(ppl[0])->setSomething(...); 

要麼,讓setSomething一個virtual功能在基類中。

雖然有一點需要注意:使用static_cast僅在您確定指針是指向Patient對象的指針時纔有效。如果有變化,那麼您不得不使用dynamic_cast,並檢查結果是不是nullptr