gpt4 book ai didi

c++ - 在 C++ 中,如何确定一个类是否是继承链中的最后一个类/子类?即在基类的另一端

转载 作者:太空狗 更新时间:2023-10-29 19:51:58 25 4
gpt4 key购买 nike

我在简洁地表述这个问题时遇到问题,但基本上类中有一个函数可能是继承链中的最后一个类,也可能不是。在此函数内部,如果类级函数是继承链中的最后一个,则将调用第二个函数。展示我在说什么比解释它容易得多,所以:

假设我有 Z 类。

Z 派生自 Y,Y 派生自 X,X 派生自 W。

所有类都有一个名为 Execute() 的虚函数。

Z.Execute() 要求 Y.Execute() 完成,这要求 X.Execute() 完成,这要求 W.Execute() 完成。

因此,Z 的 Execute() 函数如下所示:

void Z::Execute(void)
{
Y::Execute();

// do Z's stuff!
return;
}

类似地,Y 的 Execute() 函数如下所示:

void Y::Execute(void)
{
X::Execute();

// do Y's stuff!
return;
}

依此类推继承链。

但是 Y、X 和 W 都不是抽象的,因此每个都可以被实例化,并且可能是也可能不是继承链中的最后一个类。

这是我需要知道的。最后一个Execute()需要调用DoThisAtEndOfExecute()。 DoThisAtEndOfExecute() 需要在类内部调用,即。它不会公开。

所以它不能在 X 的 Execute() 中,因为如果类是 Y,它会被调用得太早。它不能在 Y 的 Execute() 中,因为类可能是 Z。它不能在 Z 的 Execute() 中,因为如果类是 Y、X 或 W,函数将永远不会被调用。

那么有没有办法让一个类判断它是否被FROM继承呢?基本上,相当于:

if (!IAmTheParentOfSomething)
DoThisAtEndOfExecute();

这是怎么做到的?我承认更简单的方法是让包含要执行的类的函数:

X.Execute();
X.DoThisAtEndOfExecute();

但这并不是这段代码的真正选择。

最佳答案

我认为如果将 Execute 拆分为非虚拟部分和虚拟部分,就可以实现您想要的。前者将运行后者,然后调用 DoThisAtEndOfExecute。像这样:

class X
{
public:
void Execute()
{
ExecuteImpl(); //That one's virtual, the derived classes override it
DoThisAtEndOfExecute();
}

protected:
virtual void ExecuteImpl()
{
//Whatever was in the legacy Execute
}
}

Y 和 Z 覆盖 ExecuteImpl() 并调用基。这样,DoThisAtEndOfExecute() 在最派生版本的 ExecuteImpl() 完成后运行,而无需了解实际的类。

关于c++ - 在 C++ 中,如何确定一个类是否是继承链中的最后一个类/子类?即在基类的另一端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33246289/

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