C++ 派生类中的函数与基类中的函数完全相同,但默认参数不同

C++ 派生类中的函数与基类中的函数完全相同,但默认参数不同,c++,inheritance,virtual,C++,Inheritance,Virtual,在本文中,您可以使用其他默认参数覆盖虚拟函数,但这样做并不明智。我的情况与这里的问题略有不同。基类中的函数和派生类中的函数应该完全相同,只是默认参数不同。我应该如何实现这一目标 用某种代码示例编辑我认为可能有效的内容,但违反了前面提到的帖子中所说的内容,对我来说似乎不是很整洁: 类基{ 公众: //我不确定这里的虚拟世界 虚空函数(bool something=true){/*做一些事情*/}; }; 派生类:公共基{ 公众: void func(bool something=false)覆盖

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

用某种代码示例编辑我认为可能有效的内容,但违反了前面提到的帖子中所说的内容,对我来说似乎不是很整洁:

类基{
公众:
//我不确定这里的虚拟世界
虚空函数(bool something=true){/*做一些事情*/};
};
派生类:公共基{
公众:
void func(bool something=false)覆盖
{
base::func(某物);/*对我来说似乎不太合适*/
}
};

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

 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); }
};

您需要发布一个代码示例。否则,很难理解你想说什么。@L.F.我添加了一些代码链接的问题也适用。如果您从
base*
指针调用
func
,您将得到
something=true
。@L.F.是的,我从链接的问题中理解了这一点,但是您应该怎么做才能防止这种情况发生?顺便说一句,是对派生类中func定义中的``base::func()```的调用,您将如何执行此操作?对我来说,这似乎有点愚蠢。你必须提供两个虚拟函数。但是这个用例是什么?在您的第一个代码示例中,派生类中的func也必须是虚拟的吗?我很确定我的派生类不会成为另一个类的基类。在第一个版本中,如果以多态方式使用基类,则不带参数的
func()
必须是虚拟的,因为基本上会覆盖它以更改它调用
func(int)
的方式。您只说明了要求具有不同的默认值-因此,
func(int)
不必是虚拟的,但(取决于类的其他要求)可以是虚拟的。如果您将
func()
func(int)
都设置为虚拟,请仔细考虑使用场景,然后仔细测试,以确保在重写这两个用例时,所有用例都能正常工作。因此,如果基类中的某个函数是虚拟的,则派生类中的同一个函数也应该是虚拟的,我的说法是正确的?与一般情况一样,始终?如果基类中的函数是虚拟的,则派生类中对它的任何重写(使用相同类型的所有参数)都是虚拟的,无论您是否显式指定。重写虚拟函数并不会使其成为非虚拟函数(尽管在C++11及更高版本中,您可以使用
final
说明符来防止进一步的派生类重写它)。在派生类中使用关键字override有何具体原因?我认为这几乎从来都不是真正必要的,不是必要的,而是有用的。它允许编译器警告您错误<代码>无效函数(int)重写将产生错误。