2012-11-21 59 views

回答

1

什麼樣的轉換你在說什麼?

如果它是關於下鑄造(或動態鑄造,這是同一種,但它在運行時驗證),那麼你被允許做強制類型檢查不檢查特定類型通過強制執行你正在指定一個。

這意味着它是代碼中的潛在突破,特定指令中缺少保證類型安全性,但有時甚至需要它,即使一個好的設計不應該事先需要它。

這個必要性是由這樣的事實給出的:即使你確定指向基本指針的指針包含派生類,也不允許調用派生類的任何方法(但編譯器可以不驗證)。

0

您需要這樣做才能訪問基類中不存在的派生類的成員。不過,有了良好的編程習慣和泛型,不管怎樣,你可能都不應該將指針類型作爲基類。

1

WHEN

所以下面有一個例子:

說你有一個工廠(動物工廠),你可以把它串或你想要什麼類型的對象枚舉...

「餵動物廠,給我一個‘狗’」

有寫你的工廠兩種方式...

你可以寫一個函數,像這樣每一個動物(優秀的程序員不這樣做):

  • 狗* GetDog();
  • Cat * GetCat();

,或者你可以寫一個工廠,一個功能像這樣(不考慮泛型現在):

  • 動物* GetAnimal(串animalType);

你知道動物其實是狗或貓這樣,您可以在類型強制轉換爲你需要的東西它是WHEN你需要訪問的狗或貓的會員...

我最喜歡的事情在C++做的是臨時投進入的東西 (原諒我的C++的生鏽)

Animal* myAnimal = Factory.GetAnimal("Dog"); 
int barkVolume = ((Dog*)myAnimal).BarkVolume; 
1

想象一下,你有一個基類Animal和兩個派生類,CatDog

// Assume methods are public. 
class Animal { virtual void Attack(); } 
class Dog : public Animal { void Meow(); } 
class Cat : public Animal { void Bark(); } 

我們可以使用基類指針參考我們的派生的對象。這有助於我們現在可以將它們包含爲相同類型。

Animal* myCat = new Cat; 
Animal* myDog = newDog; 
std::vector<Animal*> myAnimals; 
myAnimals.push_back(myCat); 
myAnimals.push_back(myDog); 

這是有用的,因爲我們可以調用基成員函數的所有各種動物,不論其派生類類型。

// Call Attack() on every cat and dog. 
for_each(myAnimals.begin(), myAnimals.end(), [](auto& e) { e->Attack(); }); 

可以使用動態鑄造測試如果基指針中的一個可以被轉換成一個派生類指針。

Cat* realCat = dynamic_cast<Cat*> myAnimals[0]; // Success. Pointer is valid. 
Cat* fakeCat = dynamic_cast<Cat*> myAnimals[1]; // Failure, it's not a cat. NULL. 

現在,您可以打電話給你的成員方法,如Meow()從派生類指針。這是不可能的,因爲Animal沒有這些方法。

realCat->Meow(); // Valid. 
myCat->Meow(); // Animal*, there is not Meow() method. 
相關問題