這個問題上what I posted hereC++向下轉換
Synth的一個後續實現發生器和軌道具有一發電機構件(其具有合成器在它)。我想要做的是一樣的東西:
Track track = Track();
cout << track.generator.varA << endl;
但是,這並不工作,所以我猜我必須以某種方式投發生器,合成器第一,這樣我纔可以訪問任何合成方法或成員,我可以」弄清楚如何做到這一點。
這個問題上what I posted hereC++向下轉換
Synth的一個後續實現發生器和軌道具有一發電機構件(其具有合成器在它)。我想要做的是一樣的東西:
Track track = Track();
cout << track.generator.varA << endl;
但是,這並不工作,所以我猜我必須以某種方式投發生器,合成器第一,這樣我纔可以訪問任何合成方法或成員,我可以」弄清楚如何做到這一點。
首先,generator
是一個指針,所以你不能使用在.
操作者進入尖銳的物體中的一員,你在這裏做的:其次
track.generator.varA // ERROR!
,既然你想一個指向派生一類D您有一個指向基類,你應該使用dynamic_cast<>
得到一個(除非你確信指向的對象是派生類的一個實例,在這種情況下,你可以使用static_cast<>
):
Synth* p = dynamic_cast<Synth*>(track.generator);
if (p != nullptr)
{
cout << p->varA << endl;
}
很好,這工作。還有一個問題:當我完成它時,是否需要刪除'* p'? – networkprofile 2013-03-03 17:12:36
@Sled:使用'new'分配的所有東西最終都必須用'delete'釋放。 – 2013-03-03 17:13:22
向下轉型當你確定你有基本指針真的是派生類型,做一個派生類型:
static_cast<Derived*>(myBasePointer)
如果你需要一個強制轉換,那意味着更好的設計是'Track'有一個指向'Synth'的指針,而不是基類。除非你在做異國情調,否則沮喪通常是設計不理想的標誌。 – 2013-03-03 17:11:06