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」が出力されます。これはスライスのせいです。 「badDog」が「Dog」オブジェクトで初期化されると、「Dog」オブジェクトの「Animal」部分のみが「badDog」にコピーされます。したがって、「badDog」は「Animal」のままで、「Dog」の動作にアクセスできません。
C では、値ベースのコピーによって参照が初期化される Java や C# などの言語とは異なり、値のセマンティクスが適用されます。クラス オブジェクトをコピーすると、独自のメモリが割り当てられたオブジェクトの別のコピーが作成され、スライスが発生します。ポリモーフィックな動作を実現するには、ある型のオブジェクトを別の型に直接割り当てるのではなく、ポインターまたは参照を C で使用する必要があります。
以上がスライスは C のポリモーフィックな動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。