【问题标题】:Use hiding members in inherited class constructor在继承的类构造函数中使用隐藏成员
【发布时间】:2018-01-11 08:26:39
【问题描述】:

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

#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++ 中做到这一点?

【问题讨论】:

  • 你没有覆盖任何东西。每个DerivedClass 对象中有两个const 整数。

标签: c++ inheritance constructor


【解决方案1】:

我不知道你是否需要基类中的常量成员,但是如果你想从派生类构造函数中指定它的值,以及可变成员的值,你可以只需使用受保护的 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不是编译时常量,它在每个对象中都占用空间。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      那么派生类可以提供不同的东西

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

      【讨论】:

        【解决方案4】:

        只需覆盖派生类构造函数中的非可变变量

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

        【讨论】:

          猜你喜欢
          • 2015-03-21
          • 2013-05-07
          • 2012-02-13
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-09
          • 2011-10-10
          相关资源
          最近更新 更多