Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基类函数调用的替代设计模式_C++ - Fatal编程技术网

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 .. 
   }
}