ホームページ > バックエンド開発 > C++ > 派生クラス オブジェクトを基本クラス ベクトルに格納するときにオブジェクトのスライスを回避するにはどうすればよいですか?

派生クラス オブジェクトを基本クラス ベクトルに格納するときにオブジェクトのスライスを回避するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-23 19:49:14
オリジナル
433 人が閲覧しました

How Can Object Slicing Be Avoided When Storing Derived Class Objects in Base Class Vectors?

派生クラスのストレージでのオブジェクトのスライス

基底クラス用に設計されたベクターに派生クラスのオブジェクトを格納すると、予期しない動作が発生する可能性があります。その理由は、派生クラス固有のメンバーが切り捨てられるオブジェクトのスライスにあります。

例:

#include <vector>
using namespace std;

class Base { public: virtual void identify() { cout << "BASE" << endl; } };
class Derived : public Base { public: virtual void identify() { cout << "DERIVED" << endl; } };

int main() {
  Derived derived;
  vector<Base> vect;
  vect.push_back(derived); // Object slicing occurs here
  vect[0].identify(); // Unexpectedly prints "BASE"
  return 0;
}
ログイン後にコピー

解決策: Smart を使用して基本クラス ポインターを格納するポインター

オブジェクトのスライスを回避するには、基本クラス オブジェクトへのポインターを格納しますベクトルで。具体的には、スマート ポインター を使用してメモリを効果的に管理します。

// Include smart pointer library
#include <memory>

// Replace raw pointers with smart pointers
vector<shared_ptr<Base>> vect;

int main() {
  Derived derived;
  vect.push_back(make_shared<Derived>(derived));
  vect[0]->identify(); // Properly prints "DERIVED"
  return 0;
}
ログイン後にコピー

スマート ポインターを使用すると、ポインターを手動で操作することなくメモリをシームレスに管理しながら、派生オブジェクトの多態性を維持できます。

以上が派生クラス オブジェクトを基本クラス ベクトルに格納するときにオブジェクトのスライスを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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