C#和Java写的多了,在能声明为接口的情况下,尽量不会声明为抽象类
昨天写C++程序,理所当然的把基类里的所有方法都写成了纯虚函数。事实上也的确应该全是纯虚函数。因为我是把两个(以后可能会是n个)硬件厂商的SDK抽象出来,硬件不一样,软件SDK差别就更大了,完全没有一致的地方。
基类的析构函数应该声明为虚函数的,索性一不做二不休声明为纯虚构函数好了。
这样,一个类似与Java中接口的C++抽象类就产生了,它只有头文件,源文件里只有两个#include,还是VS自动生成的。
等到我把实现写好,编译链接时报错:错误 1 error LNK2019: 无法解析的外部符号 "public: virtual __thiscall ::~CMyBaseClass(void)" ,该符号在函数 ******** 中被引用
查了一下,析构函数必须要有函数体,哪怕你把他声明为纯虚函数。
析构函数,构造函数这些还是和普通的函数是不一样的。对照构造函数,派生类的构造函数必须先调用基类的构造函数。也许你没调用过,那是因为默认情况下调用无参数的默认构造函数。类似的,析构函数也是一样,他必然会调用基类的析构函数,不同的是,他是后调用基类析构函数的。所以基类的析构函数必须要有函数体。
给基类纯虚析构函数加了一个空的函数体,编译链接通过,在派生类析构函数开始除设置断点,单步跟踪,在执行完派生类析构函数后,跳到基类析构函数继续执行。