2015-02-10 31 views
2

假設我有Animal類,而另一類Dog是從Animal繼承而來的。如果我輸入一個Dog對象作爲一個Animal對象,是否有可能在後來知道它最初是一個Dog?我可以告訴,如果一個對象類型轉換成父類最初是子類在C++中?

具體而言,這裏是我想要做的要點:

class Animal {}; 

class Dog: Animal {}; 

class Owner { 
    bool takeOnWalk(Animal* animalIn); 
}; 

bool Owner::takeOnWalk(Animal* animalIn) { 
    If (animalIn->isA(Dog)) {return true}; // what do I use here instead of isA? 
    return false; 
} 

int main() { 
    Dog* fido = new Dog(); 
    Animal* gato = new Animal(); 
    Owner* fred = new Owner(); 
    Owner->takeOnWalk(fido); //I want this to return true 
    Owner->takeOnWalk(gato); //this should return false 
{ 

我已經嘗試了一些事情喜歡的typeof除非據我瞭解,這些會告訴我它的動物一旦物體被鑄造成動物。理想情況下,會有一些操作嘗試將動物投射到狗身上,但如果物體不能投射到狗身上則會返回錯誤。

也許這裏的一個重要提示是,對於我的應用程序,我無法控制Dog和Animal的細節,並且類型轉換髮生在我沒有編寫的代碼中,所以我沒有看到泛型的明顯解決方案。看起來這種事情會很常見,所以我可能在這裏錯過了一些簡單的東西。有什麼建議麼?

+0

你需要一個虛擬成員在基類('虛擬〜動物(){}'是一個不錯的選擇)和'dynamic_cast的(animalIn)'(ISA) – 2015-02-10 21:55:21

回答

2

編輯:答案的其餘部分一般適用。但由於您無法控制AnimalDog,因此您可以使用dynamic_cast。這仍然需要Animal是多態的。

bool Owner::takeOnWalk(Animal* animalIn) { 
    If (dynamic_cast<Dog*>(animalIn)) {return true}; 
    return false; 
} 

REST:您可以蒐集使用typeidstd::type_infostd::type_index,組合取決於你想要怎麼能代表它polymorphic objects此信息。但這幾乎肯定是錯誤的解決方案。改用虛擬功能。例如:

class Animal 
{ 
public: 
virtual bool WantsToWalk() = 0 {return false;} 
virtual ~Animal(){} 
}; 

class Dog: public Animal 
{ 
public: 
virtual bool WantsToWalk(){return true;} 
}; 

class Owner { 
    bool takeOnWalk(Animal* animalIn) {return animalIn->WantsToWalk();} 
}; 
+0

我想'dynamic_cast'是我需要去的方式。在你的例子中,'dynamic_cast (animalIn)'不管'animalIn'是否返回true,因爲它是一個指向Animal的指針,指針可以更容易被轉換?我需要做些更像'if(dynamic_cast (* animalIn))'嗎? – nlupugla 2015-02-11 10:59:09

+0

這是我見過的第一次,給了一個純虛函數的實現。 – Zebrafish 2016-12-27 01:31:28

相關問題