gpt4 book ai didi

c++ - 如何为一个虚函数提供多个覆盖

转载 作者:行者123 更新时间:2023-11-30 00:41:06 25 4
gpt4 key购买 nike

我有以下类(class):

class A {
};

class B : public A {
};

class P {
private:
std::list<A*> l
protected:
virtual void DoIt(A* a) = 0;
public:
void WorkerThread() { for (it=l.begin(); it!=l.end(); it++) DoIt(*it); }
};

class Q : public P
{
protected:
void DoIt(A* a) { print("false"); }
void DoIt(B* b) { print("true"); }
};

不幸的是,DoIt(B* b) 永远不会被调用。DoIt(A* a) 将始终被调用,即使我将 B 对象添加到列表中也是如此。

我该怎么做才能调用 DoIt(B* b) ?如果 B 不知道 Q 是否有可能实现这一点?如果没有动态转换,是否有可能实现这一目标?

谢谢

最佳答案

好吧,没有人真正直接回答你的问题(好吧,我已经试过了)所以我会的。不过,此处的其他一些“答案”实际上对解决您的问题更有帮助。

问题是 void DoIt(B*) 不是虚函数 DoIt(A*) 的覆盖。这是一个过载。有很大的不同。

当您说当您传递 B* 时不会调用 DoIt(B*) 时,我必须假设您通过指向更高层次结构的指针持有指向您 Q 的引用或指针。在那些情况下,静态名称解析只会找到 DoIt(A*),并且由于 B* 是 A*,它会被向上转换,这就是被调用的版本。因为它是虚拟的,所以 Q 中的覆盖被调用。

如果您有一个指向 Q 的指针作为指向 Q 的指针,并使用 B* 调用 DoIt,则应该调用 DoIt(B*) 函数。此时不需要也不使用双重调度。

当你有两个抽象类型和一个必须根据两个抽象的具体类型表现不同的函数时,你需要双重分派(dispatch)。当您在比静态命名提供的更高级别上使用 Q 上的 B 调用 DoIt 时,这就是您试图做的事情。有太多的方法可以满足不同的需求,能够根据您的情况提出一种解决方案而不是另一种解决方案,真的不知道您要解决什么问题。事实上,你甚至可能不需要它!对您来说更好的方法可能是将 DoIt(B*) 作为虚函数实现在高层结构中。

我建议您阅读 Andre Alexandrescu 的书《现代 C++ 设计》并仔细阅读。他解释了一个非常酷的访问者实现以及一个可扩展的多重调度机制。但不要就此止步,还有其他出色的实现可以以不同的方式回答这个问题。

祝你好运。

关于c++ - 如何为一个虚函数提供多个覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463437/

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