在C++中,你必須認識到不同的價值和參考語義之間,其中,在interpretet的語言,你往往只是處理引用語義(除了一些奇怪的具有價值語義但除點之外的普通舊數據對象的情況)。
在C++中,所有對象都是值,例如一個對象永遠不可能是null
,這意味着聲明指定了存儲需求。 考慮對狗以下
struct creature {
};
struct dog : public creature {
float cuteness;
};
的存儲需求比生物的不同,即使您允許的轉換,這將導致切片。 例如,將fido樹皮或保持沉默? 的#include
class creature {
public:
virtual void speak() {
std::cout << "..." << std::endl;
}
};
class dog : public creature {
public:
virtual void speak() {
std::cout << "woof!" << std::endl;
}
};
int main(int argc, const char *argv[]) {
creature fido;
fido = dog();
fido.speak();
return 0;
}
但是如果你只需有一個指針或參考對象是另一回事。 通過指針。
creature* fido = new dog();
fido->speak();
delete fido;
作爲參考。
dog fido;
creature& c = fido;
c.speak();
超出此問題的範圍,但可以選擇一個智能指針。
std::unique_ptr<creature> fido(new dog);
有趣!我對最後提到的引用有點好奇。如果'Creature'有一個名爲'talk()'和'Dog'的虛擬方法覆蓋它,會調用'thing'的樹皮調用'Creature's或'Dog's? – 2013-03-23 20:57:28
@CoreyMaddieBesmer它會調用'Dog',因爲當通過指針或引用調用虛擬成員函數時,會查找對象的* dynamic *類型。 「東西」的動態類型是「狗」。 – 2013-03-23 21:01:07