【问题标题】:How can I initialize a const variable of a base class in a derived class' constructor in C++?如何在 C++ 中的派生类的构造函数中初始化基类的 const 变量?
【发布时间】:2011-04-23 17:11:19
【问题描述】:

我有一个没有构造函数的抽象 C++ 类。它应该是一个基类,以便其他类可以继承它。我要做的是在基类中声明一个常量变量并在每个派生类的构造函数中初始化它,但在每个类中都没有。它在 C++ 中合法吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: c++ inheritance constructor constants


    【解决方案1】:

    在 C++ 中是否合法?

    没有。常量必须在基类构造函数中初始化。

    解决方案是在您的基类中提供适当的构造函数——否则无法使用。此外,没有理由不提供该构造函数。

    class Base {
        int const constant;
    public:
        virtual ~Base() = 0; // Makes this an abstract base class.
    protected:
        Base(int c) : constant(c) { }
    };
    
    // Must be implemented!
    Base::~Base() { }
    
    class Derived : public Base {
    public:
        Derived() : Base(42) { }
    };
    

    【讨论】:

    • 如果你将基类构造函数设为protected,那么你就不用担心其他人会直接实例化它。
    • 我想如果抽象基类中有构造函数,它就不再抽象了,因为它可以被实例化。我错了吗?
    • @Zooba:正确。查看我更新的代码。 ;-) 此外,还有其他方法可以使基类抽象(即不可实例化)。标准的方法是提供一个纯虚函数(例如方便地析构函数,无论如何必须是虚函数)。
    • @user246392:是的,你错了。看我的代码:构造函数是受保护的,所以不能直接实例化类。更重要的是,有一个纯虚函数,所以即使有公共构造函数,类也不能自己构造。
    • +1,是的,是的。注意,如果你要在头文件中实现Base::~Base,它应该是inline virtual
    【解决方案2】:

    如果你需要这样做:

    struct Base {
        Base( std::string const & someValue )
        : const_value( someValue ) {
        }
    protected:
       std::string const const_value;
    };
    
    struct Derived : Base {
        Derived()
        : Base("Derived"){
        }
    };
    

    这样做的原因是您只能在初始化时将值分配给 const 值。初始化 Base 后,您将无法再修改该值。因此,您必须按照上面所示的方式进行操作。

    【讨论】:

      【解决方案3】:

      为什么不在抽象基类中创建一个受保护的构造函数并在那里设置常量值?

      【讨论】:

        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        相关资源
        最近更新 更多