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)重写将产生错误。