スマートポインタによるポリモーフィズム

バックル

答えが指摘しているように、これは私が犯したばかげた間違いであり、ポリモーフィズムやスマートポインターとは何の関係もありません。修正されたバージョンは、受け入れられた回答にあります。

==============元の質問==================

私はスマートポインターをポリモーフィズムで機能させようとしています。次のプロトタイプコードでは、純粋virtual関数の実装Base::print()Derivedオブジェクトのメモリブロックにある必要があります。オブジェクトDerivedWrapへのポインタにアクセスできDerivedます。

DerivedWrap::print()関数の実装にアクセスできないのはなぜですか?

using namespace std;

class Base 
{
public:
    virtual void print() = 0;
};

class Derived : public Base 
{
public:
    Derived(int in) : i(in) {}

    void print() {
        cout << "int is " << i << endl;
    }

private:
    int i;
};

class DerivedWrap 
{
public:
    DerivedWrap() : DerivedWrap(make_unique<Derived>(2)) {}
    DerivedWrap(unique_ptr<Base> pBase) : _pBase(move(pBase)) {}

    void print()
    {
        _pBase->print();
    }

private:
    unique_ptr<Base> _pBase;
};

int main() 
{
    DerivedWrap pDW1();
    pDW1->print(); // error: request for member ‘print’ in ‘pDW1’, which is of non-class type ‘DerivedWrap()’

    DerivedWrap pDW2(make_unique<Derived>(2));
    pDW2->print(); // error: base operand of ‘->’ has non-pointer type ‘DerivedWrap’
    return 0;
}

JeJo

いくつか問題があります。

  • これDerivedWrap pDW1();は、戻り値の型がDerivedWrapである関数宣言ですそれはあなたが期待しているデフォルトのコンストラクターを呼び出していません。あなたは単に必要です
    DerivedWrap pDW1;  // calls the default constructor
    // or 
    // DerivedWrap pDW1{};
    
  • 第二に、pDW1は単なるDerivedWrapオブジェクトです。したがって、を呼び出す必要はありませんoperator->要するに必要です
    DerivedWrap pDW1;
    pDW1.print(); 
    
    同じことがpDW2。にも当てはまりますあなたが必要
    DerivedWrap pDW2(std::make_unique<Derived>(2));
    pDW2.print();
    
  • 最後になりましたが、定義された動作にBase必須のvirtualデストラクタです。詳細:仮想デストラクタを使用する場合

要するに、あなたは必要です

#include <iostream>
#include <memory>

class Base
{
public:
   virtual void print() = 0;
   virtual ~Base() = default;  // provide virtual destructor
};

class Derived /*final*/: public Base
{
public:
   // ... other code

   void print() override // recommended to override the virtual functions
   {
      std::cout << "int is " << i << std::endl;
   }
private:
   int i;
};

class DerivedWrap /* final */
{
public:
   // ...other code

   void print()
   {
      _pBase->print();
   }

private:
   std::unique_ptr<Base> _pBase;
};

int main()
{
   DerivedWrap pDW1; // or DerivedWrap pDW1{};
   pDW1.print();

   DerivedWrap pDW2{ std::make_unique<Derived>(2) };
   pDW2.print();
}

ちなみに、練習しないでくださいusing namespace std;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ポリモーフィズムとポインターを使用した構造体によるキャスト

分類Dev

リポジトリパターンのジェネリックスによるポリモーフィズム

分類Dev

コレクション内のスマートポインターポリモーフィズム

分類Dev

C ++ポリモーフィズム基本クラスポインタをベクトルに格納する

分類Dev

ポリモーフィズムに使用される参照とポインター?

分類Dev

ポインタの再割り当てがポリモーフィズムにどのように影響するか

分類Dev

インターフェイスで継承とポリモーフィズムを効果的に利用する方法

分類Dev

パフォーマンス:スイッチとポリモーフィズム

分類Dev

自動コピー=値による、ポリモーフィズムをサポートする適切なタイプの非静的フィールド

分類Dev

サブタイピングによるポリモーフィズムの考え方

分類Dev

Javaのポリモーフィズムとインターフェース

分類Dev

Javaのポリモーフィズムとインターフェース

分類Dev

C ++インターフェース、継承、ポリモーフィズム

分類Dev

ポリモーフィズムとインターフェース-明確化?

分類Dev

GOインターフェイスのポリモーフィズム

分類Dev

インターフェイスでポリモーフィズムを適切に実装するにはどうすればよいですか?

分類Dev

clangとgccは、スマートポインターを使用するときに、ポリモーフィズムの非仮想ベースデストラクタについて警告しませんか?

分類Dev

ポリモーフィズムによるオブジェクトのスワッピング位置

分類Dev

ベクトルおよびポリモーフィズムへの一意のポインタ

分類Dev

静的ポリモーフィズム:インターフェースを定義する方法は?

分類Dev

ポリモーフィズムとコンストラクター

分類Dev

コードファーストとDBContextによるポリモーフィズム

分類Dev

概念ベースのポリモーフィズムc ++による多重継承

分類Dev

Javaポリモーフィズムのキャスト-ランタイムエラーClassCastException

分類Dev

ポリモーフィズムC ++:派生クラスコンストラクターによって指定された値を使用しないベースポインターのフィールド

分類Dev

QVariantによるポリモーフィズム

分類Dev

C ++によるポリモーフィズム

分類Dev

C ++ 11先物によるポリモーフィズム

分類Dev

ポインターを使用せずにCでポリモーフィズムをシミュレートする

Related 関連記事

  1. 1

    ポリモーフィズムとポインターを使用した構造体によるキャスト

  2. 2

    リポジトリパターンのジェネリックスによるポリモーフィズム

  3. 3

    コレクション内のスマートポインターポリモーフィズム

  4. 4

    C ++ポリモーフィズム基本クラスポインタをベクトルに格納する

  5. 5

    ポリモーフィズムに使用される参照とポインター?

  6. 6

    ポインタの再割り当てがポリモーフィズムにどのように影響するか

  7. 7

    インターフェイスで継承とポリモーフィズムを効果的に利用する方法

  8. 8

    パフォーマンス:スイッチとポリモーフィズム

  9. 9

    自動コピー=値による、ポリモーフィズムをサポートする適切なタイプの非静的フィールド

  10. 10

    サブタイピングによるポリモーフィズムの考え方

  11. 11

    Javaのポリモーフィズムとインターフェース

  12. 12

    Javaのポリモーフィズムとインターフェース

  13. 13

    C ++インターフェース、継承、ポリモーフィズム

  14. 14

    ポリモーフィズムとインターフェース-明確化?

  15. 15

    GOインターフェイスのポリモーフィズム

  16. 16

    インターフェイスでポリモーフィズムを適切に実装するにはどうすればよいですか?

  17. 17

    clangとgccは、スマートポインターを使用するときに、ポリモーフィズムの非仮想ベースデストラクタについて警告しませんか?

  18. 18

    ポリモーフィズムによるオブジェクトのスワッピング位置

  19. 19

    ベクトルおよびポリモーフィズムへの一意のポインタ

  20. 20

    静的ポリモーフィズム:インターフェースを定義する方法は?

  21. 21

    ポリモーフィズムとコンストラクター

  22. 22

    コードファーストとDBContextによるポリモーフィズム

  23. 23

    概念ベースのポリモーフィズムc ++による多重継承

  24. 24

    Javaポリモーフィズムのキャスト-ランタイムエラーClassCastException

  25. 25

    ポリモーフィズムC ++:派生クラスコンストラクターによって指定された値を使用しないベースポインターのフィールド

  26. 26

    QVariantによるポリモーフィズム

  27. 27

    C ++によるポリモーフィズム

  28. 28

    C ++ 11先物によるポリモーフィズム

  29. 29

    ポインターを使用せずにCでポリモーフィズムをシミュレートする

ホットタグ

アーカイブ