为什么要从 Inherited class 调用 Base Class 虚拟成员?
Why call a Base Class virtual member from an Inherited class?
我从事 C++ 工作多年,但没有接受过正规培训。我的大部分背景是航空航天,我们必须总是重新发明轮子,不使用第 3 方库或 APIs,所以这些对我来说有点新鲜。
我正在做一些确实有 API 的事情,我对一些现有代码有点困惑。问同事,他们也没有答案。
我有一个 class 继承了 API 的 Application
class。这个 Application
class 有一个名为 onUpdate()
的受保护虚函数,描述为:
Function Callback for updating logic, called every frame
class MyApp : public Application {
public:
virtual void onUpdate() override;
}
void MyApp::onUpdate() {
Application::onUpdate(); // Why do this?
...
}
首先,我认为回调中会有某种函数指针、lambda 等。
有人提到的唯一答案是,这是一个“典型”的做法,因此 Application::onUpdate()
函数(可能不同)将被调用。但是,如果有的话,不声明虚函数覆盖基础 class 实现吗?
我原以为如果有必要,文档会说“如果您选择自己编写,请务必调用基础 class onUpdate
函数”。
我试过在通话中设置断点,但似乎没有任何作用。我想知道编译器是否正在优化它,甚至认为我有 -O0
。我可以删除它,代码看起来 运行 很好,但它非常复杂,所以我不想造成一些下游问题。
我什至不确定要搜索什么。我似乎找不到类似的例子。这个实现有正式的名称吗?我在思考这个问题时遇到了麻烦。
Why call a Base Class virtual member from an Inherited class?
如果您 want/need 覆盖函数来执行基本函数的操作,那么调用该函数而不是复制代码会很有用。如果该函数访问基的私有状态,甚至可能是必要的。
I would have thought that if this is necessary, the documentation would say something like "be sure to call the base class onUpdate function if you choose to write your own".
在必要的情况下,基础 class 文档最好如此说明。
Is there a formal name for this implementation?
如果您的意思是“此设计模式是否有名称”,您的问题中没有足够的细节来准确回答,但仅根据名称,我猜这是观察者模式的一部分.
根据我提供的信息,我认为原始问题已得到最好的回答。
框架的实现决定了它的使用方式。
就我而言,特定框架隐藏了很多细节。
虽然不常见,但这并非闻所未闻,可以被视为反模式,“Call Super”
感谢您的帮助。
我从事 C++ 工作多年,但没有接受过正规培训。我的大部分背景是航空航天,我们必须总是重新发明轮子,不使用第 3 方库或 APIs,所以这些对我来说有点新鲜。
我正在做一些确实有 API 的事情,我对一些现有代码有点困惑。问同事,他们也没有答案。
我有一个 class 继承了 API 的 Application
class。这个 Application
class 有一个名为 onUpdate()
的受保护虚函数,描述为:
Function Callback for updating logic, called every frame
class MyApp : public Application {
public:
virtual void onUpdate() override;
}
void MyApp::onUpdate() {
Application::onUpdate(); // Why do this?
...
}
首先,我认为回调中会有某种函数指针、lambda 等。
有人提到的唯一答案是,这是一个“典型”的做法,因此 Application::onUpdate()
函数(可能不同)将被调用。但是,如果有的话,不声明虚函数覆盖基础 class 实现吗?
我原以为如果有必要,文档会说“如果您选择自己编写,请务必调用基础 class onUpdate
函数”。
我试过在通话中设置断点,但似乎没有任何作用。我想知道编译器是否正在优化它,甚至认为我有 -O0
。我可以删除它,代码看起来 运行 很好,但它非常复杂,所以我不想造成一些下游问题。
我什至不确定要搜索什么。我似乎找不到类似的例子。这个实现有正式的名称吗?我在思考这个问题时遇到了麻烦。
Why call a Base Class virtual member from an Inherited class?
如果您 want/need 覆盖函数来执行基本函数的操作,那么调用该函数而不是复制代码会很有用。如果该函数访问基的私有状态,甚至可能是必要的。
I would have thought that if this is necessary, the documentation would say something like "be sure to call the base class onUpdate function if you choose to write your own".
在必要的情况下,基础 class 文档最好如此说明。
Is there a formal name for this implementation?
如果您的意思是“此设计模式是否有名称”,您的问题中没有足够的细节来准确回答,但仅根据名称,我猜这是观察者模式的一部分.
根据我提供的信息,我认为原始问题已得到最好的回答。
框架的实现决定了它的使用方式。 就我而言,特定框架隐藏了很多细节。 虽然不常见,但这并非闻所未闻,可以被视为反模式,“Call Super”
感谢您的帮助。