【问题标题】:Store derived object in vector of base type将派生对象存储在基本类型的向量中
【发布时间】:2013-03-27 05:23:55
【问题描述】:

我有一个基类类型指针的 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();
}

问题可能出在这里吗?

【问题讨论】:

  • 对我来说看起来不错。你是如何调用函数的?
  • 请仔细检查您尝试调用的函数是否标记为virtual
  • 需要更多细节。用最小(ish)基础和派生类做一个模型,并检查你是否可以重复这个问题。如果不是,请与您的实际使用情况进行比较以了解原因;如果是,请在此处报告。
  • 我同意凯文巴拉德的观点。确保您的派生类也为其功能使用虚拟关键字。

标签: c++ inheritance polymorphism derived


【解决方案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&lt;&gt; 转换指针,即使它破坏了使用虚拟方法的全部意义。祝你好运。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2012-02-05
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多