【发布时间】:2011-04-23 17:11:19
【问题描述】:
我有一个没有构造函数的抽象 C++ 类。它应该是一个基类,以便其他类可以继承它。我要做的是在基类中声明一个常量变量并在每个派生类的构造函数中初始化它,但在每个类中都没有。它在 C++ 中合法吗?如果是这样,我该怎么做?
【问题讨论】:
标签: c++ inheritance constructor constants
我有一个没有构造函数的抽象 C++ 类。它应该是一个基类,以便其他类可以继承它。我要做的是在基类中声明一个常量变量并在每个派生类的构造函数中初始化它,但在每个类中都没有。它在 C++ 中合法吗?如果是这样,我该怎么做?
【问题讨论】:
标签: c++ inheritance constructor constants
在 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,那么你就不用担心其他人会直接实例化它。
Base::~Base,它应该是inline virtual。
如果你需要这样做:
struct Base {
Base( std::string const & someValue )
: const_value( someValue ) {
}
protected:
std::string const const_value;
};
struct Derived : Base {
Derived()
: Base("Derived"){
}
};
这样做的原因是您只能在初始化时将值分配给 const 值。初始化 Base 后,您将无法再修改该值。因此,您必须按照上面所示的方式进行操作。
【讨论】:
为什么不在抽象基类中创建一个受保护的构造函数并在那里设置常量值?
【讨论】: