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

5
我想继承一个成员函数并给它不同的默认值,但是不重新定义它。我该怎么办?
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
}

@MrSmith42:调用站点。那通常是位置。 - MSalters
4个回答

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的一个特性。


3
不,你不能这样做。但是可以按照以下方法进行实现。
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
在Scott Meyers的《Effective C++》一书中,有一章叫做“永远不要重新定义一个函数的继承默认参数值”。真的不应该这样做。你可以阅读这一章,了解关于如果这样做会发生的所有恐怖情况的非常有说服力的解释。

2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接