在 C++ 中覆盖时更改签名

Changing signature while Overriding in C++

我有基地class

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

我想在 overriding 时更改签名,如下所示:

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

是否有可能以某种方式实现这一点,因为我对新添加的参数使用默认值?

我能看到的唯一解决方案是同时实现 int getArea() int getArea(int),其中一个函数可以调用另一个函数(例如 int getArea() { return getArea(0); }).你不能让带参数的重载有默认参数。

您需要重载您的虚函数。但是如果你重载了虚函数,你会得到一个警告“hides overloaded virtual function”

解决方案是使用本机签名覆盖函数并使用虚拟前缀重载它。

示例:

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) {
       ...
   }
};