derived class 中的函数与 base class 中的函数完全相同,但默认参数不同

Function in derived class exactly the same as in base class but different default parameter

阅读此 post,您可以使用其他默认参数覆盖虚函数,但这样做并不明智。我的情况与那里的问题略有不同。我的基础 class 中的函数和派生 class 中的函数应该完全相同,只是默认参数不同。我应该如何实现这一目标?

使用某种代码示例进行编辑,我认为可能有效但违反了前面提到的 post 中所说的并且对我来说似乎不太整洁:

class base {
public:
    //not sure about the virtual here
    virtual void func(bool something = true) { /*Do some stuff*/};
};

class derived : public base {
public:
    void func(bool something = false) override
    {
        base::func(something); /*Doesn't seem like the way to go for me */
    }
};

一个选项是显式重载函数,而不依赖默认参数

 class Base
 {
     public:
         virtual void func() {func(2);}   // call func(int) with one default
         void func(int value);
 };

 class Derived: public Base
 {
      public:
         using Base::func;    // so the function which accepts an argument is
                              //   not hidden from users the class
         virtual void func() {func(42);}    // call Base::func(int) with different value
 };

根据需要,默认值可能更容易成为构造函数设置的成员。

 class Base
 {
     public:
         Base() : default_value(2) {};
         void func() {func(default_value);}
         void func(int value);

     protected:
         Base(int defaulted) : default_value(defaulted) {};

     private:
         int default_value;
 };

 class Derived: public Base
 {
      public:
         Derived() : Base(42) {};    // set different default value in the constructor
 };

根据您的需要(考虑到要求只是为函数提供不同的默认值,但其他方面相同)您可能希望考虑将函数保留为非虚函数。

你可能超载了

class base {
public:
    virtual ~base() = default;
    virtual void func() { func(true); };
    virtual void func(bool something) // Maybe this one no longer need to be virtual
    { /*Do some stuff*/ }             // then using different name is appropriate
                                      // (avoid hiding issues)
};

class derived : public base {
public:
    using base::func;

    void func() override { func(false); }
};