11

C++11 スマート ポインターを使用してアプリケーションを書き直しています。

私は基本クラスを持っています:

class A {};

そして派生クラス:

class B : public A {
  public:
  int b;
};

A または B オブジェクトを持つベクトルを含む別のクラスがあります。

class C {
  public:
  vector<shared_ptr<A>> v;
};

A (基本クラス) オブジェクトを使用して C を構築することに問題はありませんが、B (派生クラス) オブジェクトを使用するにはどうすればよいですか?

私はこれを試しています:

for(int i = 0; i < 10; i++) {
    v.push_back(make_shared<B>());
    v.back()->b = 1;
};  

そして、コンパイラは次を返します: エラー: 'クラス A' には 'b' という名前のメンバーがありません</p>

4

2 に答える 2

17

しかし、どうすれば B (派生クラス) オブジェクトで埋めることができるでしょうか?

オブジェクト(へのポインタ)で埋めていBます。ただし、ポインターの静的型は基本クラスを参照するため、Aこれらを直接使用して派生クラスのメンバーにアクセスすることはできません。

あなたの簡単な例では、ポインタを保持してBそれを使用するだけです:

std::shared_ptr<B> b = make_shared<B>();
b->b = 1;
v.push_back(b);

元のポインターにアクセスできない場合は、何らかのポリモーフィズムが必要になります。

  • すべてのオブジェクトに型があることがわかっているstatic_cast<B*>(v.back().get()) 場合に使用しますB
  • dynamic_castオブジェクトが異なるタイプを持つ可能性がある場合は、仮想関数を使用するか(基本クラスに仮想関数が含まれている必要があります)
于 2013-04-02T11:00:18.613 に答える
5
for(int i = 0; i < 10; i++) {
    auto bptr = make_shared<B>();
    v.push_back(bptr);
    bptr->b = 1;
};  
于 2013-04-02T10:51:54.250 に答える