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); }
};
阅读此 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); }
};