0

基本クラス型のポインターの std::vector があります。

vector<Base*> baseList;

そして、派生クラス型をベクターにプッシュします。

Derived* derivedObject = new Derived();
baseList.push_back(derivedObject);

しかし、リストを反復し、派生クラスによって基本クラスからオーバーライドされた関数を呼び出すと、派生クラスのコードは呼び出されません。ベクトルを正しい方法で使用していますか?

私の基本クラスは、その関数を宣言する前に virtual キーワードを使用しており、派生クラスは次のように基本クラスを派生させます。

class Derived : public Base

私がここで間違っていることは何ですか?

編集:

私が宣言した関数を呼び出すには:

typedef vector<App*>::iterator AppIterator;
AppIterator begin() { return l_Apps.begin(); }
AppIterator end()   { return l_Apps.end(); }

そして、私は次のように関数を呼び出します:

for (AppIterator it = begin(); it != end(); ++it)
{
    (*it)->Initialize();
}

問題はここにありますか?

4

1 に答える 1

1

イテレータで試してみました...このコードは私にとってはうまくいくので、問題が解決しない場合は、別のコンパイラを検討してください=)

#include <iostream>
#include <vector>

class Base
{
public:
    virtual void f()
    {
        std::cout << "Base\n";
    }
};
class Derived: public Base
{
public:
    virtual void f()
    {
        std::cout << "Derived\n";
    }
};
int main()
{
    std::vector<Base*> s;
    s.push_back(new Base());
    s.push_back(new Derived());
    s.push_back(new Base());
    s.push_back(new Derived());
    s.push_back(new Base());
    s.push_back(new Derived());
    for (std::vector<Base*>::iterator it = s.begin(); it != s.end(); ++it)
    {
        (*it)->f();
    }
    return 0;
}

私が持っている出力:

Base
Derived
Base
Derived
Base
Derived

dynamic_cast<>また、仮想メソッドを使用することの全体的なポイントが無効になる場合でも、によってポインターをキャストしようとする場合があります。幸運を。

于 2013-04-04T23:17:45.010 に答える