标签:
class Abstract_base {
public:
virtual ~Abstract_base() = 0;
virtual void interface() const = 0;
virtual const char * mumble() const { return _mumble; }
protected:
char *_mumble;
}; 有什么问题?虽然这个 class 被设计为一个抽象的base class(其中有pure virtual function,使得Abstract_base不可能拥有实体),但它仍然需要一个明确的构造函数以初始化其data member _mumble.如果没有这个初始化操作,其derived class
的局部性对象_mumble将无法决定初值,例如:class Concrete_derived : public Abstract_base {
public:
Concrete_derived();
};
void foo() {
// Abstract_base::_mumble未被初始化
Concrete_derived trouble;
} 可能说是:也许Abstract_base的设计者试图让其每一个derived class 提供_mumble的初值.然而如果这样,derived class 的唯一要求就是Abstract_base必须提供一个带有唯一参数的 protected constructor:Abstract_base::Abstract_base(char *mumble_val = 0) : _mumble(mumble_value)
{} 一般而言,class 的data member应该初始化,并且只在constructor中或是在 class 的其他member functions中指定初值,其他任何操作都将破坏封装性质,使 class 的维护和修改更加困难.// OK:定义pure virtual function,但只能被静态地调用(invoked statically)
inline void Abstract_base::interface() const {
function
// ...
}
inline void Concrete_derived::interface() const {
// OK:静态调用(static invocation)
Abstract_base::interface();
function
// ...
} 要不要这样做,全由 class 设计者决定.唯一的例外就是pure virtual destructor:class 设计者一定得定义它.为什么?因为每一个derived class destructor会被编译器加以扩展,以静态调用的方式调用其"每一个virtual base class"以及"上一层base
class"的destructor.因此,只要缺乏任何一个base class desstructors的定义,就会导致链接失败.class Abstract_base {
public:
virtual ~Abstract_base(); // 不再是pure
virtual void interface() = 0;
const char *mumble() const { return _mumble; } // 不再是virtual
protected:
Abstract_base(char *pc = 0); // 新增一个带有唯一参数的constructor
char *_mumble;
};版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/47448829