gpt4 book ai didi

c++ - 避免 dynamic_cast 的模式

转载 作者:IT老高 更新时间:2023-10-28 22:08:24 24 4
gpt4 key购买 nike

我有一个类:

class A 
{
public:
virtual void func() {…}
virtual void func2() {…}
};

还有一些派生类,比如 B、C、D... 在 95% 的情况下,我想遍历所有对象并调用 func 或 func2(),因此我将它们放在一个 vector ,例如:

std::vector<std::shared_ptr<A> > myVec;

for (auto it = myVec.begin(); it != myVec.end(); ++it)
(*it).func();

但是,在其余 5% 的情况下,我想根据它们的子类对类做一些不同的事情。我的意思是完全不同的,比如调用带有其他参数的函数,或者根本不调用某些子类的函数。我已经想到了一些解决这个问题的方法,但没有一个是我真正喜欢的:

  • 使用 dynamic_cast 分析子类。不好,太慢了,因为我经常打电话而且硬件有限

  • 在每个子类中使用一个标志,例如枚举 {IS_SUBCLASS_B, IS_SUBCLASS_C}。不好,感觉不OO。

  • 还将类放在其他 vector 中,每个 vector 都有其特定的任务。这也不是真正的OO,但也许我在这里错了。喜欢:

    std::vector<std::shared_ptr<B> > vecForDoingSpecificOperation;
    std::vector<std::shared_ptr<C> > vecForDoingAnotherSpecificOperation;

那么,有人可以提出一种可以实现我想要的样式/模式吗?

最佳答案

某个聪明人(不幸的是我忘记了谁)曾经说过 C++ 中的 OOP:switch-ing 类型的唯一原因(这是你所有的建议所建议的)是害怕虚拟函数。(这是释义。)将虚函数添加到派生类可以覆盖的基类中,然后就可以设置了。
现在,我知道在某些情况下这很难或难以处理。为此,我们有访问者模式。

有一种情况更好,另一种情况更好。通常,经验法则是这样的:

  • 如果您有一组相当固定的操作,但要保持添加类型,请使用虚拟函数
    操作很难添加到大的继承层次结构中/从中删除,但是只需让它们覆盖适当的虚函数,就可以轻松添加新类型。

  • 如果您有一组相当固定的类型,但要保持添加操作,请使用 visitor pattern .
    向大量访问者添加新类型是一件令人头疼的事情,但是向一组固定类型添加新访问者却很容易。

(如果两者都改变​​,那么你注定要失败。)

关于c++ - 避免 dynamic_cast 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com