C におけるポリモーフィズムとスライス
継承を扱う場合、C プログラマはスライスの問題に遭遇することがあります。次のコードを考えてみましょう:
#include <iostream> using namespace std; class Animal { public: virtual void makeSound() { cout << "rawr" << endl; } }; class Dog : public Animal { public: virtual void makeSound() { cout << "bark" << endl; } }; int main() { Animal animal; animal.makeSound(); Dog dog; dog.makeSound(); Animal badDog = Dog(); badDog.makeSound(); Animal* goodDog = new Dog(); goodDog->makeSound(); }
このコードは次の出力を生成します:
rawr bark rawr bark
出力が代わりに "rawr bark bark bark" になると予想されるので、これは驚くかもしれません。 。違いは、 badDog 割り当てでのスライスの使用にあります。
Animal badDog = Dog();
この場合、Dog のデータは Animal オブジェクトに切り取られるため、Dog 固有の情報が失われます。これは、Dog() が Dog オブジェクトを作成しますが、それを Animal オブジェクトである badDog に割り当てる場合、Dog の Animal 部分のみがコピーされるためです。
スライスを避けるには、ポインタまたは参照:
Animal* badDogPtr = new Dog(); Animal& goodDogRef = dog;
ポインターと参照は期待どおりに動作し、多態性の動作が可能です。これは、値セマンティクスの場合のようにオブジェクトのコピーを持つのではなく、オブジェクトへの参照を参照または保持するためです。
Java や C# などの言語では、参照セマンティクスがデフォルトですが、 C 、値セマンティクスがデフォルトです。 C でのポリモーフィックな動作の場合、参照またはポインターを明示的に使用する必要があります。
以上がポリモーフィズムとスライスは C のオブジェクトの動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。