Изменение подписи при переопределении в C++

У меня есть базовый класс

class Shape{
    public:
        virtual int getArea()=0;
}

Хочу поменять подпись пока overriding как это:

class Rectangle : class Shape{
    public:
        int getArea(int someParameter = 0){
            return 0;
        }
}

Можно ли как-то добиться этого, так как я использую значение по умолчанию для вновь добавленного параметра?

1 ответ

Решение

Единственное решение, которое я вижу, это то, что вы реализуете оба int getArea() а также int getArea(int)где одна функция может вызывать другую (например, int getArea() { return getArea(0); }). Вы не можете иметь перегрузку, принимающую аргумент, тогда есть аргумент по умолчанию.

Вам нужно перегрузить вашу виртуальную функцию. Но если вы перегружаете виртуальную функцию, вы получите предупреждение "скрывает перегруженную виртуальную функцию".

Решение - переопределить функцию с помощью собственной подписи и перегрузить ее виртуальным префиксом.

Пример:

class A {
   virtual void foo(int) {...}
};

class B: public A {
   void foo(int i) override {
       A::foo(i);
   }
   
   virtual void foo(const std::string& str) {
       ...
   }
};

Другие вопросы по тегам