C++ では、値セマンティクスと参照セマンティクスの違いを理解する必要があります。一方、インタプリタ言語では、参照セマンティクスだけを扱う傾向があります (ただし、値セマンティクスを持っているが要点以外の単純な古いデータ オブジェクトの奇妙なケースを除きます)。
C++ では、すべてのオブジェクトは値です。たとえば、オブジェクトが になることはありませんnull
。これは、宣言がストレージ要件を指定することを意味します。次のことを考慮してください
struct creature {
};
struct dog : public creature {
float cuteness;
};
犬のストレージ要件は、クリーチャーのストレージ要件とは異なります。変換を許可したとしても、これによりスライスが発生します。たとえば、フィドは吠えますか、それとも黙っていますか? #含む
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);