【问题标题】:Changing signature while Overriding in C++在 C++ 中覆盖时更改签名
【发布时间】:2015-06-11 06:24:16
【问题描述】:

我有一个基类

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

我想在overriding这样更改签名:

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

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

【问题讨论】:

  • 如果你改变了你不再覆盖的签名,你就是超载了。不,不再可能使用多态性,因为 Shape::getAreaRectangle::getArea 是两个不同的函数。
  • @JoachimPileborg:我明白,但有什么出路吗?
  • @Abhinav :这是不可能的。你可以在这里得到一些信息stackoverflow.com/questions/411103/…
  • 您可以通过定义一个单独的“AreaParameter”层次结构、声明虚拟获取指针或对此类参数的引用 (virtual int getArea(const AreaParameter &p = AreaParameter()))、在子类和那里向下转换参数类型。 (或者通常使用任何双重调度技术......)

标签: c++ default-value overriding method-signature


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你需要重载你的虚函数。但是如果你重载了虚函数,你会得到一个警告“隐藏重载的虚函数”

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多