ホームページ > バックエンド開発 > C++ > ポリモーフィズムとスライスは C のオブジェクトの動作にどのような影響を与えますか?

ポリモーフィズムとスライスは C のオブジェクトの動作にどのような影響を与えますか?

Patricia Arquette
リリース: 2024-12-02 05:20:09
オリジナル
723 人が閲覧しました

How Does Polymorphism and Slicing Affect Object Behavior in C  ?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート