【问题标题】:stl collections and polymorphismstl 集合和多态性
【发布时间】:2023-04-11 04:52:01
【问题描述】:
class A { }

class B : public A { }

std::vector<B*> things;

void Func1(const std::vector<B*>& Bthings) {} 
void Func2(const std::vector<A*>& Athings) {}

Func1(things); // ok 
Func2(things); // not ok

我在使用上述代码时遇到了一些问题。我有一个指向对象的指针的 stl 集合,但我不希望 Func2 知道子类。有没有很好的方法来做到这一点?我知道std::vector&lt;B*&gt; 不是std::vector&lt;A*&gt;,但我不认为这是一个罕见的问题。我能想到的只是有 2 个单独的 A*s 和 B*s 列表,这似乎是错误的?

【问题讨论】:

    标签: pointers collections stl


    【解决方案1】:

    我不认为这是一个罕见的问题

    这不是一个罕见的问题。解决方案指日可待:

    template <typename T>
    void Func2(const std::vector<T*>& Athings) {}
    

    当然,这可能不是您想要的,但它是最接近的匹配项。混合使用编译时多态(模板、重载)和运行时多态(函数覆盖和类继承)并不能很好地混合。

    如果您无法接受上述情况,最好的办法是复制整个向量。

    【讨论】:

    • 模板对我来说不是很好,但我会选择“复制整个向量”
    【解决方案2】:

    一种解决方案是将这些函数设为成员函数并将Func2 设为私有。

    【讨论】:

    • 如果函数属于不同的库,这是不可能的。
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多