C++ 基类函数调用的替代设计模式
我有一个客户端可以“关闭”的基类: 但是客户可以(如果他们愿意)创建一个子类来满足他们自己的需要:C++ 基类函数调用的替代设计模式,c++,C++,我有一个客户端可以“关闭”的基类: 但是客户可以(如果他们愿意)创建一个子类来满足他们自己的需要: struct der : public base { void shutdown(double some, int other, bool parameters) { //custom shutdown stuff base::shutdown(); //<- thus MUST be called } }; 结构顺序:公共基{ 无效关闭(双部分、整数其他、布尔参数
struct der : public base {
void shutdown(double some, int other, bool parameters) {
//custom shutdown stuff
base::shutdown(); //<- thus MUST be called
}
};
结构顺序:公共基{
无效关闭(双部分、整数其他、布尔参数){
//自定义关机工具
base::shutdown();//不幸的是,这是“必须做正确的事情”的情况之一在编写代码时。这适用于编程中的许多事情。如果在计算某些东西时没有进行正确的计算,那也是错误的。或者如果调用一个函数两次,而该函数只调用一次。或者在必须调用它时根本不调用它。所有这些都是“做错了”.你不能阻止程序员犯错误 当然,如果没有添加一些额外的参数,可以“反向”进行通过在基类中有一个不被重写的非虚函数,然后让基类在派生类中调用一个
virtual
函数。正如我所说,如果基类中没有需要进入派生类的参数,那么它就不起作用
我的意思的一个例子:
struct base {
void shutdown() final { // final: it can't be overridden in derived class
do_shutdown(); // Calls derived function's
// ... more code here ...
}
virtual void do_shutdown() { } // default is "do nothing".
};
struct der: public base
{
// not overriding `shutdown`, but overriding `do_shutdown`
void do_shutdown()
{
.. some code goes here ..
}
}
现在对der->shutdown()
的调用将调用基类的实现,该实现在基类的shutdown
中完成之前在派生类中调用do\u shutdown
然而,正如我所说的,当你这样做的时候,你不能添加额外的参数——事实上,派生一个类并更改参数是“错误的”——虽然你不可能这样做,但在使用继承多态性时,这往往是一件坏事,因为多态性的全部目的是有一些通用的代码“不知道它是基类对象、derived1对象还是derived2对象“-因此,如果它需要知道哪种类型的对象要传递正确数量的参数,它就会变得有点毫无意义。我不担心它。它类似于派生类的赋值运算符。如果子类开发人员忘记调用它,那不是你的错,但如果不是,那也不是错误。”
使用类的析构函数执行“关闭”。@DavidBrown从这个意义上讲,它不是一个关闭,因为对象在“关闭”后应该是可用的(并且将被使用)。您应该将
shutdown()设为final
,否则子类仍然可以直接重写它。
struct base {
void shutdown() final { // final: it can't be overridden in derived class
do_shutdown(); // Calls derived function's
// ... more code here ...
}
virtual void do_shutdown() { } // default is "do nothing".
};
struct der: public base
{
// not overriding `shutdown`, but overriding `do_shutdown`
void do_shutdown()
{
.. some code goes here ..
}
}