2013-03-03 74 views
0

這個問題上what I posted hereC++向下轉換

Synth的一個後續實現發生器和軌道具有一發電機構件(其具有合成器在它)。我想要做的是一樣的東西:

Track track = Track(); 
cout << track.generator.varA << endl; 

但是,這並不工作,所以我猜我必須以某種方式投發生器,合成器第一,這樣我纔可以訪問任何合成方法或成員,我可以」弄清楚如何做到這一點。

+0

如果你需要一個強制轉換,那意味着更好的設計是'Track'有一個指向'Synth'的指針,而不是基類。除非你在做異國情調,否則沮喪通常是設計不理想的標誌。 – 2013-03-03 17:11:06

回答

1

首先,generator是一個指針,所以你不能使用在.操作者進入尖銳的物體中的一員,你在這裏做的:其次

track.generator.varA // ERROR! 

,既然你想一個指向派生一類D您有一個指向基類,你應該使用dynamic_cast<>得到一個(除非你確信指向的對象是派生類的一個實例,在這種情況下,你可以使用static_cast<>):

Synth* p = dynamic_cast<Synth*>(track.generator); 
if (p != nullptr) 
{ 
    cout << p->varA << endl; 
} 
+0

很好,這工作。還有一個問題:當我完成它時,是否需要刪除'* p'? – networkprofile 2013-03-03 17:12:36

+1

@Sled:使用'new'分配的所有東西最終都必須用'delete'釋放。 – 2013-03-03 17:13:22

0

向下轉型當你確定你有基本指針真的是派生類型,做一個派生類型:

static_cast<Derived*>(myBasePointer)