2

A、B、C、D の 4 つのクラスがあるとします。

A は基本クラスです。B は A から派生します。C は A から派生します。

D は B から派生します。

各タイプのオブジェクトのベクトルがあります。

関連するクラス (ファミリ?) から除外された、Z と呼ばれる 5 番目のクラスを作成します。Z には、紫と呼ばれるクラス A のオブジェクトを指す変数が含まれています。

次のような方法で「ファミリ間の」ユニバーサル ポインタを作成できますか? A * pUniversal;

そして、pUniversal を A、B、C、または D に、その型のベクトルに格納されたオブジェクトに交換可能にポイントします。次に、Z の紫色の変数を pUniversal に設定しますか?

4

3 に答える 3

2

はい、できます。これは、派生クラスを持つことの主な利点の 1 つです。

またはでA実装する必要がある関数がある場合は、それらが仮想であることを確認してください。BC

于 2013-04-05T01:55:33.730 に答える
1

はい、できます!いいえ、私はオバマ氏ではありません =P ですが、reinterpret_cast<>キーワード (演算子) について何かを読むことを検討するかもしれません。


編集:reinterpret_cast<>基本クラスのポインターを派生クラスのポインターにキャストするために使用できます。

于 2013-04-05T01:58:24.060 に答える
0

例:

  #include <iostream>
  #include <vector> 
  class A
  {
  public:
    virtual void SayHi() {
      std::cout<<"A says hi"<< std::endl;
    }

  };

    class B : public A
    {
    public:
        virtual void SayHi() {
          std::cout<<"B says hi"<<std::endl;
        }

    };

    class C: public A 
    {
    public:
        virtual void SayHi() {
          std::cout<<"C says hi"<<std::endl;
        }
    };

    typedef std::shared_ptr<A> APtr;
    typedef std::vector<APtr> Container;

  int main()
  {
      Container myContainer;
      // Store A's instance or any of its derivatives.
      myContainer.push_back(APtr(new A));
      myContainer.push_back(APtr(new B));
      myContainer.push_back(APtr(new C));

      for(/*Container::iterator or */ auto pbase = myContainer.begin(); pbase != myContainer.end(); pbase++)
          (*pbase)->SayHi();

      myContainer.clear();

      return 0;
  }
于 2013-04-05T02:09:33.667 に答える