Функция в производном классе точно такая же, как в базовом классе, но другой параметр по умолчанию - PullRequest
3 голосов
/ 24 апреля 2020

Прочтите в этом посте , что вы можете переопределить виртуальную функцию с другими аргументами по умолчанию, но это не слишком разумно. Мой случай немного отличается от вопроса там. Функция в моем базовом классе и функция в моем производном классе должны работать точно так же, только аргумент по умолчанию отличается. Как я должен go добиться этого?

РЕДАКТИРОВАТЬ с каким-то примером кода, что, я думаю, может работать, но нарушает то, что сказано в предыдущем посте, и не кажется мне очень аккуратным:

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 */
    }
};

Ответы [ 2 ]

5 голосов
/ 24 апреля 2020

Один из вариантов - явная перегрузка функции, а не использование аргументов по умолчанию.

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

В зависимости от ваших потребностей (и учитывая, что требуется только, чтобы функция снабжалась разными значениями по умолчанию, но в остальном они были одинаковыми), вы можете sh рассмотреть вопрос о том, чтобы оставить функции не виртуальными. .

2 голосов
/ 24 апреля 2020

Возможно, вы перегружены

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); }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...