在继承的类构造函数中使用隐藏成员

Use hiding members in inherited class constructor

本文关键字:隐藏 成员 构造函数 继承      更新时间:2023-10-16

在继承的类构造函数中,我想使用一个类常量成员来隐藏基类构造函数中的基类一:

#include <string>
#include <iostream>
class BaseClass {
    private:
    const int constant_variable { 21 };
    public:
    int mutable_variable;
    BaseClass(): mutable_variable(constant_variable) {};
};
class DerivedClass: public BaseClass {
    private:
    const int constant_variable { 42 };
    public:
    using BaseClass::BaseClass;
};
int main () {
    DerivedClass dc;
    std::cout << dc.mutable_variable << std::endl; // 21, but I want it to be 42
    return 0;
}

例如,在示例代码中,BaseClass 的构造函数使用自己的值 constant_variable,而我希望它使用 DerivedClass 的constant_variable

如何在 c++ 中执行此操作?

我不知道

你是否需要基中的常量成员,但如果你想从派生类构造函数中指定它的值,以及可变成员的值,你可以只使用受保护的 c'tor:

class BaseClass {
    private:
    const int constant_variable { 21 };
    protected:
    BaseClass(int init) : constant_variable{init}, mutable_variable{init}
    {}
    public:
    int mutable_variable;
    BaseClass(): mutable_variable(constant_variable) {}
};
class DerivedClass: public BaseClass {
    public:
    DerivedClass() : BaseClass(42) {}
};

您应该知道constant_variable不是编译时常量,它占用每个对象的空间。

使基类构造函数将该值作为默认参数。

BaseClass::BaseClass(int constant = 21)
  : mutable_variable(constant)
{}

然后派生类可以提供不同的东西

DerivedClass::DerivedClass()
 : BaseClass(41)
{}

基类构造函数必须被告知值,它甚至不知道派生发生。最简单的方法是更改基类 ctor 以采用具有感兴趣值的参数。

只需重写派生类构造函数中的不可变变量

#include <string>
#include <iostream>
class BaseClass {
    private:
    const int constant_variable { 21 };
    public:
    int mutable_variable;
    BaseClass(): mutable_variable(constant_variable) {};
};
class DerivedClass: public BaseClass {
    private:
    public:
        DerivedClass()
        {
            mutable_variable = 42;
        }
};
int main () {
    DerivedClass dc;
    std::cout << dc.mutable_variable << std::endl; // returns 42
    return 0;
}