C++ 允许使用virtual
关键字定义成员函数的默认行为,但是如果我想扩展成员函数以执行附加功能怎么办?例如,我有以下代码:
virtual void OnSize(HWND hWnd, LPARAM lParam) {
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
rect = { 0, 0, cxClient, cyClient };
}
cxClient
、cyClient
、 和rect
是在接收消息时更新的成员变量WM_SIZE
。如果我想更新继承类中的滚动条,我必须重写该函数以添加此功能,但随后我需要重复用于更新成员变量的代码:
void OnSize(HWND hWnd, LPARAM lParam) override {
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
rect = { 0, 0, cxClient, cyClient };
vScrollBar->setInfo(cyClient); // new functionality
}
为什么C++不提供extend
关键字来允许扩展虚函数的默认行为,即保留默认行为并合并附加功能。例如:
void OnSize(HWND hWnd, LPARAM lParam) extend {
vScrollBar->setInfo(cyClient); // new functionality
}
即将发布的 C++ 修订版是否考虑了这一点?
在 中
DerivedClass::OnSize()
,您可以致电BaseClass::OnSize()
来实现您想要的目的。不需要特殊的关键字。C++ 委员会对于是否向该语言添加额外的关键字犹豫不决,特别是对于那些不需要它们就可以实现的事情。存在使现有代码(可能使用宏、编译器扩展等)因语言本身的此类扩展而无效的危险。因此,如果看到
extends
C++ 即将修订版被考虑,我会感到相当惊讶。现有的构造允许派生类在调用基类功能之前和之后都有代码,这实际上优于extends
.解决这个问题的一种方法是提供两个函数。一个非虚拟的具体函数具有要运行的通用代码,然后是您在具体函数末尾调用的另一个虚拟函数,该函数具有您想要合并的类特定行为。那看起来像
现在,如果您有一个
Derived
对象d
调用,do_action
将调用基类函数,该函数将运行公共代码,然后虚拟分派到d
'sdo_action_impl
。