3 六月 2016
3 六月 2016
class CAnimal { public: CAnimal(); // 构造函数 virtual void Sound() = 0; // 一个纯虚函数 private: double m_legs_count; // 动物有多少只脚 };这里Sound() 是一个纯虚函数,因为它通过纯虚函数PURE (=0)的说明符来声明。
class CAnimal { public: virtual void Sound()=NULL; // PURE 类函数,应该在派生类覆盖,CAnimal 现在是抽象的,不能被创建 }; //--- 从抽象类派生 class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE 被覆写,CCat 不是抽象并且可以被创建 }; //--- 错误使用的例子 new CAnimal; // 'CAnimal' 错误 - 编译器返回 "不能举例说明抽象类" 错误 CAnimal some_animal; // 'CAnimal' 错误 - 编译器返回 "不能举例说明抽象类" 错误 //--- 正确使用的例子 new CCat; // 无错误 - CCat 类非抽象 CCat cat; // 无错误 - CCat 类非抽象抽象类的限制
//+------------------------------------------------------------------+ //| 一个抽象基类 | //+------------------------------------------------------------------+ class CAnimal { public: //--- 一个纯虚函数 virtual void Sound(void)=NULL; //--- 函数 void CallSound(void) { Sound(); } //--- 构造函数 CAnimal() { //--- 显式调用虚拟类函数 Sound(); //--- 隐式调用(使用第三个函数) CallSound(); //--- 构造函数和/或析构函数总是调用其自己的函数, //--- 即使它们是虚拟函数,并且在派生类被调用的函数覆写 //--- 如果调用的函数是纯虚函数 //--- 这个调用会导致 "纯虚函数调用"的关键执行错误 } };然而,抽象类的构造函数和析构函数可以调用其他成员函数。
typedef int (*TFunc)(int,int);现在,TFunc 是一个类型,可以声明变量函数指针:
TFunc func_ptr;func_ptr 变量可以存储函数指针用于未来的声明:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; //错误:neg不是int (int,int)类型 Print(func_ptr(10)); // 错误:应有两个参数函数指针可以存储和作为参数传递。您不能获得非静态类函数的指针。
修复崩溃日志中报告的错误。