C ++继承具有不同默认参数值的函数

时间:2015-01-12 13:35:05

标签: c++ inheritance

我想继承一个成员函数而不重新定义它,但给它不同的默认值。我该怎么办?

class Base{
  public:
    void foo(int val){value=val;};
  protected:
    int value;
};

class Derived : public Base{
  public:
    void foo(int val=10);
};

class Derived2 : public Base{
  public:
    void foo(int val=20);
};

void main(){
   Derived a;
   a.foo();//set the value field of a to 10
   Derived2 b;
   b.foo();//set the value field of b to 20
}

4 个答案:

答案 0 :(得分:6)

不要使用默认值,请使用重载:

class Base{
    public:
        virtual void foo() = 0;

    protected:
        void foo(int val) { value = val; }

    private:
        int value;
};

class Derived : public Base {
    public:
        void foo() override { Base::foo(10); }
};

class Derived2 : public Base {
    public:
        void foo() override { Base::foo(20); }
};

override修饰符是C ++ 11。

答案 1 :(得分:2)

在Scott Meyers的“Effective C ++”中有一章称为“从不重新定义函数的继承默认参数值”。你真的不应该。你可以阅读关于如果你将要发生的所有恐怖事件的非常有说服力的解释的章节。

答案 2 :(得分:2)

不,你不能。但你可以像这样实现它。

class Base{
public:
    virtual int getDefaultValue() = 0;
    void foo(){value = getDefaultValue();};
protected:
    int value;
};

class Derived : public Base{
public:
    int getDefaultValue() {
        return 10;
    }
};

class Derived2 : public Base{
public:
    int getDefaultValue() {
        return 20;
    }
};

答案 3 :(得分:1)

你必须重新定义它 - 没有其他方法可以指定不同的默认参数。但是你可以通过调用基本版本来保持实现的简单性:

class Base{
  public:
    void foo(int val){value=val;};
  protected:
    int value;
};

class Derived : public Base{
  public:
    void foo(int val=10) { Base::foo(val); }
};

class Derived2 : public Base{
  public:
    void foo(int val=20) { Base::foo(val); }
};