标签:
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