Изменение подписи при переопределении в 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) {
...
}
};