如何使用默认参数从构造函数调用超级构造函数? 我有两个C++类,一个基类和一个子类。基类定义一些属性,子类定义一些其他属性。现在,在子类中,构造函数是用几个默认参数定义的,它还需要包含基类中的默认参数。我该怎么做

如何使用默认参数从构造函数调用超级构造函数? 我有两个C++类,一个基类和一个子类。基类定义一些属性,子类定义一些其他属性。现在,在子类中,构造函数是用几个默认参数定义的,它还需要包含基类中的默认参数。我该怎么做,c++,inheritance,constructor,C++,Inheritance,Constructor,例如: // Base.h class Base { protected: State _state; State _previousState; public: Base(); }; // Sub.h class Sub : public Base { private: int _rate; int _checkCount; public: explicit Sub(int sampleRat

例如:

// Base.h
class Base {
    protected:
        State _state;
        State _previousState;

    public: Base();
};

// Sub.h
class Sub : public Base {
    private:
        int _rate;
        int _checkCount;

    public: explicit Sub(int sampleRate);
};

// Sub.cpp
Sub::Sub(int rate)
    :_state(Silent),
    _previousState(Running),
    _rate(rate),
    _checkCount(0)
{
}

显然,在Sub.ccp构造函数中,_state和_previousState参数放错了位置。如何将它们正确地集成到此构造中?

方法是为基本构造函数提供一些参数,并使用参数调用它:

Base::Base(State state = {}, State previousState = {})
   : _state(state)
   , _previousState(previousState)
{}

// ...

Sub::Sub(int rate)
   : Base(Silent, Running)
   , _rate(rate)
   , _checkCount(0)
{}

您可以为基类提供带有默认值的默认构造函数

// Base.h
    class Base {
        protected:
            State _state;
            State _previousState;

        public: Base( );
    };

// Sub.h
class Sub : public Base {
    private:
        int _rate;
        int _checkCount;

    public: explicit Sub(int sampleRate);
};

// Sub.cpp
    Sub::Sub(int rate)
        _rate(rate),
        _checkCount(0)
    {
     _state=Slience;
     _previousState=Running;
    }


另一种方式:由于基类中的数据成员受到保护,因此可以在子类的构造函数函数体中更改其值

// Base.h
    class Base {
        protected:
            State _state;
            State _previousState;

        public: Base( );
    };

// Sub.h
class Sub : public Base {
    private:
        int _rate;
        int _checkCount;

    public: explicit Sub(int sampleRate);
};

// Sub.cpp
    Sub::Sub(int rate)
        _rate(rate),
        _checkCount(0)
    {
     _state=Slience;
     _previousState=Running;
    }

请选择“派生”和“基础”,并一致使用这些术语。“Sub”和“super”是混淆的;在这两组术语之间切换更糟糕……如果您在答案中添加一些解释,您可能会获得更多的投票。在子类主体中指定值也可以,谢谢您的提示!谢谢但是,它已经在头文件中定义了构造函数。如果我想在Base.cpp中使用实际的构造函数实现呢?@hexagonstar:我不明白。也许我只是误解了这一点。如果我在.h文件中为一个ctor提供大括号,这意味着它是在那里定义的,但是如果ctor的大括号不在.h文件中,它们应该在.cpp文件中定义,不是吗?或者它的定义在哪里有关系吗(我想是的)?@hexagonstar:对不起,我不知道你在问什么。我已经向您展示了构造函数的参数列表和定义。取决于您如何安排声明和定义,就像您将用任何其他构造函数和成员函数一样。对C++仍然是新的,并且困惑为什么构造函数实现可以在头文件中定义。但我已经掌握了窍门,谢谢!