C ++のスーパークラスへのポインターのベクトルからサブクラス変数にアクセスします

ベンリンゼイ

スーパークラスへのポインターのベクトルがあり、そのベクトルにサブクラスのメンバーを追加すると、サブクラス関数を問題なく呼び出すことができますが、コードが現在のところ、サブクラスに固有の変数にアクセスできません。Bポインタからアクセスするにどうすればよいvecですか?

#include <iostream>
#include <vector>

class Super {
  public:
    int A;
    Super(int a) : A(a) {}
    virtual void foo() = 0;
};

class Sub : public Super {
  public:
    int B;
    Sub(int a, int b) : Super(a), B(b) {}
    void foo() {
      std::cout << "calling foo from Sub\n";
    }   
};

int main() {
  std::vector<Super*> vec;
  vec.push_back(new Sub(2, 3));
  vec[0]->foo();                                // No problem
  std::cout << "A: " << vec[0]->A << std::endl; // No problem
  std::cout << "B: " << vec[0]->B << std::endl; // Compile Error
}
軌道上の明度レース

dynamic_cast<Sub*>(またはstatic_cast<Sub*>、各ポインタがを指していることを保証できる場合でも)でそれを素朴に修正することはできますSubが、…しないでください!これは仮想ディスパッチの教科書ケースです。

継承階層全体のインターフェイスvirtual void print(std::ostream&)一部であると、operator<<その階層内の任意のタイプのオブジェクトで呼び出すことができるを追加します。そう、C ++ランタイム多型の魔法と機能があなたのためにすべてこれを行うオーバーライドしてみましょうmainとの違いについて知る必要はありませんAか、Bそれぞれが持っているか、どのようなメンバ変数、また図にどの種類のオブジェクトのあなたのポインタの各実際の点から。

また、メモリリークを回避するために、スマートポインタを格納する必要があります。

#include <iostream>
#include <vector>
#include <memory>

struct Super {
    int A;
    Super(int a) : A(a) {}

    virtual void foo() = 0;
    virtual void print(std::ostream& os) const
    {
        os << "A: " << A << '\n';
    };
};

struct Sub : Super {
    int B;

    Sub(int a, int b) : Super(a), B(b) {}

    void foo() { std::cout << "calling foo from Sub\n"; }
    virtual void print(std::ostream& os) const
    {
        Super::print(os);
        os << "B: " << B << '\n';
    }
};

std::ostream& operator<<(std::ostream& os, const Super& obj)
{
    obj.print(os);
    return os;
}

int main()
{
   std::vector<std::unique_ptr<Super>> vec;
   vec.emplace_back(std::make_unique<Sub>(2, 3));
   vec[0]->foo();
   std::cout << *(vec[0]);
}

ライブデモ

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

抽象クラスポインタベクトルのサブクラスのメンバーにアクセスするC ++

分類Dev

C ++で、被駆動クラスへのポインターからネストされたクラスのメンバーにアクセスする方法

分類Dev

基本クラスへのc ++ベクトルポインター、および複数の派生クラスメソッドへのアクセス

分類Dev

クラスC ++のプライベート変数へのアクセス

分類Dev

C ++-関数内のスーパークラス一致サブクラス引数へのポインターを作成します

分類Dev

c ++は、メンバーオブジェクトからインスタンス化クラスの他のメンバーにアクセスします

分類Dev

C ++のshared_ptrを使用して、パブリック静的メンバー関数からプライベートコンストラクターにアクセスします

分類Dev

Objective-C:サブクラスのプライベート変数アクセスを許可する

分類Dev

パブリックメンバー変数にC ++の同じクラスのプライベートメンバーにアクセスさせる

分類Dev

プライベート構造体データメンバーからC ++クラスパブリックメンバー関数にアクセスする

分類Dev

C ++の外部クラスコンストラクター引数として内部クラスオブジェクトへのポインターを使用する

分類Dev

C ++-同じクラスの静的関数から、クラスのプライベートメンバーにアクセスする方法は?

分類Dev

クラスC ++からベクトルへのポインタを返す

分類Dev

C#でのマルチエンドポイントWebサービス(ASMX)のベストプラクティスへのアクセス

分類Dev

C ++スーパークラスコンストラクターで、サブクラスがオーバーライドする多くの変数に依存するコードを実行する正しい方法は何ですか?

分類Dev

C#の別のクラスからプライベート変数に引き続きアクセスできます

分類Dev

逆順C ++からベクターにアクセスする際のランタイムエラー

分類Dev

C ++の子クラスの親クラスのプライベート変数にアクセスするにはどうすればよいですか

分類Dev

CからMIPSへのクイックソート-スタックフレームのパラメーターを渡し、変数を維持する方法は?

分類Dev

C ++プライベートネストクラス-さまざまな関数へのアクセス

分類Dev

サブクラスからスーパークラスc ++にコンストラクター値を渡す

分類Dev

C#のリストからオブジェクトパラメータにアクセスする

分類Dev

共有変数へのインラインasmアクセスは、C ++ 11のデータ競合としてカウントされますか?

分類Dev

Windowsインストーラー、C ++のカスタムアクション内のカスタムプロパティにアクセスします

分類Dev

C#のポータブルクラスライブラリのシリアルポートへのアクセス

分類Dev

C ++ "<デフォルトのコンストラクター>からパラメーター化されたコンストラクターに変換するのに適したコンストラクターが存在しません

分類Dev

C ++-{スーパークラス}の変数を{サブクラス}にキャストする

分類Dev

C#別のフォームからラベルの配列にアクセスし、それらの「テキスト」プロパティを変更する

分類Dev

プライベートvoid関数c#内の別のクラスから変数にアクセスする

Related 関連記事

  1. 1

    抽象クラスポインタベクトルのサブクラスのメンバーにアクセスするC ++

  2. 2

    C ++で、被駆動クラスへのポインターからネストされたクラスのメンバーにアクセスする方法

  3. 3

    基本クラスへのc ++ベクトルポインター、および複数の派生クラスメソッドへのアクセス

  4. 4

    クラスC ++のプライベート変数へのアクセス

  5. 5

    C ++-関数内のスーパークラス一致サブクラス引数へのポインターを作成します

  6. 6

    c ++は、メンバーオブジェクトからインスタンス化クラスの他のメンバーにアクセスします

  7. 7

    C ++のshared_ptrを使用して、パブリック静的メンバー関数からプライベートコンストラクターにアクセスします

  8. 8

    Objective-C:サブクラスのプライベート変数アクセスを許可する

  9. 9

    パブリックメンバー変数にC ++の同じクラスのプライベートメンバーにアクセスさせる

  10. 10

    プライベート構造体データメンバーからC ++クラスパブリックメンバー関数にアクセスする

  11. 11

    C ++の外部クラスコンストラクター引数として内部クラスオブジェクトへのポインターを使用する

  12. 12

    C ++-同じクラスの静的関数から、クラスのプライベートメンバーにアクセスする方法は?

  13. 13

    クラスC ++からベクトルへのポインタを返す

  14. 14

    C#でのマルチエンドポイントWebサービス(ASMX)のベストプラクティスへのアクセス

  15. 15

    C ++スーパークラスコンストラクターで、サブクラスがオーバーライドする多くの変数に依存するコードを実行する正しい方法は何ですか?

  16. 16

    C#の別のクラスからプライベート変数に引き続きアクセスできます

  17. 17

    逆順C ++からベクターにアクセスする際のランタイムエラー

  18. 18

    C ++の子クラスの親クラスのプライベート変数にアクセスするにはどうすればよいですか

  19. 19

    CからMIPSへのクイックソート-スタックフレームのパラメーターを渡し、変数を維持する方法は?

  20. 20

    C ++プライベートネストクラス-さまざまな関数へのアクセス

  21. 21

    サブクラスからスーパークラスc ++にコンストラクター値を渡す

  22. 22

    C#のリストからオブジェクトパラメータにアクセスする

  23. 23

    共有変数へのインラインasmアクセスは、C ++ 11のデータ競合としてカウントされますか?

  24. 24

    Windowsインストーラー、C ++のカスタムアクション内のカスタムプロパティにアクセスします

  25. 25

    C#のポータブルクラスライブラリのシリアルポートへのアクセス

  26. 26

    C ++ "<デフォルトのコンストラクター>からパラメーター化されたコンストラクターに変換するのに適したコンストラクターが存在しません

  27. 27

    C ++-{スーパークラス}の変数を{サブクラス}にキャストする

  28. 28

    C#別のフォームからラベルの配列にアクセスし、それらの「テキスト」プロパティを変更する

  29. 29

    プライベートvoid関数c#内の別のクラスから変数にアクセスする

ホットタグ

アーカイブ