非原创,在学习
5 构造、解构、拷贝语意学Semantics of Construction,Destruction, and Copy
考虑下面这个abstract base class声明:
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;
// ...
}
测试
一般而言,class的 data member应该被初始化,并且只在 constructor中或是在class的其它 member functions中指定初值。其它任何操作都将破坏封装性质,使class的维护和修改更加困难。
纯虚拟函数的存在( Presence of a Pure Virtual Function )
C++新手常常很惊讶地发现,一个人竟然可以定义和调用( invoke ) 一个pure virtual function;不过它只能被静态地调用( invoked statically),不能经由虚拟机制调用。例如,你可以合法地写下这段码:
// 定义纯虚函数
// 但是只可能被静态调用
inline void
Abstract_base::interface() const {
std::cout << "Abstract_base::interface() const has been recalled" << std::endl;
}
inline void
Concrete_derived::interface() const {
// 调用纯虚函数
Abstract_base::interface();
std::cout << "Concrete_derived::interface() const has been recalled" << std::endl;
}
这里把前面的代码一整合,子类公有继承父类,测试:
报错,子类中没有声明:virtual void interface() const = 0。给子类中加上这句究没问题了。