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

スライスは C のポリモーフィックな動作にどのような影響を与えますか?

Barbara Streisand
リリース: 2024-12-04 02:14:14
オリジナル
692 人が閲覧しました

How Does Slicing Affect Polymorphic 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」が出力されます。これはスライスのせいです。 「badDog」が「Dog」オブジェクトで初期化されると、「Dog」オブジェクトの「Animal」部分のみが「badDog」にコピーされます。したがって、「badDog」は「Animal」のままで、「Dog」の動作にアクセスできません。

C では、値ベースのコピーによって参照が初期化される Java や C# などの言語とは異なり、値のセマンティクスが適用されます。クラス オブジェクトをコピーすると、独自のメモリが割り当てられたオブジェクトの別のコピーが作成され、スライスが発生します。ポリモーフィックな動作を実現するには、ある型のオブジェクトを別の型に直接割り当てるのではなく、ポインターまたは参照を C で使用する必要があります。

以上がスライスは C のポリモーフィックな動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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