在 C++ 中,您必须意识到值语义和引用语义之间的区别,而在解释语言中,您倾向于只处理引用语义(除了一些奇怪的情况,即具有值语义的普通旧数据对象,但除此之外)。
在 C++ 中,所有对象都是值,例如对象永远不可能是null
,这意味着声明指定了存储要求。考虑以下
struct creature {
};
struct dog : public creature {
float cuteness;
};
狗的存储要求与生物的存储要求不同,即使您允许转换,这也会导致切片。例如,fido 会吠叫还是保持沉默?#包括
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);