【问题标题】:C++ : get inherited type from abstract pointer vectorC++:从抽象指针向量中获取继承类型
【发布时间】:2014-11-07 18:29:30
【问题描述】:

所以我有一个包含组件抽象类指针的向量
假设我有 2 个从组件继承的类 foo 和 bar ,有没有办法从这里获取类型为“foo”的指针向量?

    vector<Component*> components;
    class foo : Component;
    class bar : Component;
    components.push_back(new foo());
    components.push_back(new bar());

谢谢。

【问题讨论】:

  • 这似乎是糟糕的设计,但这只是我的看法。
  • 每个组件的工作与另一个完全不同,它们几乎没有任何共同点……持有者类循环遍历所有组件并调用它们的所有虚拟方法。这是我能想到的最好方法
  • 我不知道你想做什么,但通常,依赖于类的行为应该实现为虚函数(多态)。如果您希望该机制是可扩展的(在不涉及具体组件的情况下随着时间的推移添加新功能/操作),请考虑 visitor 模式。
  • 我真的不打算扩展它,Component 类有一个 Start ,一个 Update 和一个 Render 虚函数,仅此而已。

标签: c++ pointers inheritance vector


【解决方案1】:

是的:

Component* c = components[0];
if (foo* f = dynamic_cast<foo*>(c)) {
    // use f
}
else {
    // c is not a foo. Maybe it's a bar, or something else
}

所以如果你想写一个函数来findfoo*,你可以这样做(假设 C++11):

foo* find_foo(const std::vector<Component*>& components)
{
    for (auto c : components) {
        if (foo* f = dynamic_cast<foo*>(c)) {
            return f;
        }
    }
    return nullptr;
}

演员 dynamic_cast&lt;foo*&gt; 将返回一个有效的 foo*nullptr,它不会抛出。从标准§5.2.7.9:

转换为指针类型失败的值是所需结果类型的空指针值。

【讨论】:

  • 如果类不包含虚拟,这项工作是否可行?
  • @user3562972 不,它们必须是虚拟的。如果不是,则转换将无法编译,因为源类型必须是多态的。
  • @dau_sama 不,它不会抛出。
  • @dau_sama 你不是指虚拟交互。你的意思是一个虚函数(通常至少析构函数应该是虚函数)。
【解决方案2】:

是的,您可以通过使用 RTTI 的概念来做到这一点:-

#include <typeinfo>
//Using for loop iterate through all elements
if ( typeid(*iter) == typeid(Foo) )
  //You got the Foo object

但这在 C++ 中几乎是不可取的。

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2018-03-07
    • 2017-07-30
    相关资源
    最近更新 更多