今天在写纯虚类的时候,遇到了两个问题现在特意记录下来,目的是以后好避免再犯
- 在写纯虚类的函数头文件时候,声明纯虚函数的时候忘记标记"=0"
- “=0”这个操作在虚函数中有2层意思:
- 有的朋友误解这是返回值为0的意思,但是它并不是,它仅表示的是这个是个纯虚函数,是个抽象函数,没有实现
- 这个类的继承类里面必须要实现这个函数。
- “=0”这个操作在虚函数中有2层意思:
1 //animal.h 2 class Animal//这里的这个类他是个纯虚类,不能被实例化 3 { 4 public: 5 Animal() {} 6 virtual void eat()=0;//这个函数没有实现,但是在继承类中必须要实现 7 } 8 9 class Animal 10 { 11 public: 12 Animal() {} 13 virtual void eat();//这个是普通的虚函数,有实现 14 }
- 当我们写虚基类的时候,它的构造函数必须有实现:
- 首先我们要弄清楚构造函数的调用顺序:从当前类往上找父类,一直找到最上层的父类,它是最先构造的,然后沿着继承路径依次往下构造,一直到当前类,也是就一句话:初始化基类的子对象,派生类的构造函数要调用基类的构造函数
1 //animal.h 2 class Animal 3 { 4 public: 5 Animal() {}//这里的这个类的构造函数我们需要实现,否则编译报错 6 virtual void eat()=0; 7 } 8 9 class Tiger:public Animal 10 { 11 public: 12 Tiger() {} 13 void eat override() { 14 qDebug()<<"delicious!!wow"; 15 } 16 }
- 当我们用delete释放虚基类指针出错。
- 首先我们得明白析构函数的调用顺序:从当前类开始析构,析构完再沿着继承路径往上找父类 ,析构父类,再找到最上层的父类析构
- 所以这里我们必须要保证虚基类的析构函数必须要有虚析构函数:因为虚析构函数的主要作用是表明其析构操作全部由子类的析构函数来实现。
1 //animal.h 2 class Animal 3 { 4 public: 5 Animal() {}//这里的这个类的构造函数我们需要实现,否则编译报错 6 virtual ~Animal() {}//这里的这个类的析构函数必须标记virtual 7 virtual void eat()=0; 8 } 9 10 class Tiger:public Animal 11 { 12 public: 13 Tiger() {} 14 void eat override() { 15 qDebug()<<"delicious!!wow"; 16 } 17 } 18 19 //Client mian.cpp 20 int main(int argc, char *argv[]) 21 { 22 QCoreApplication a(argc, argv); 23 Animal* ani=new Tiger(); 24 ani->eat (); 25 delete ani;//如果上面析构函数不标记virtual,这里会报错 26 }
以上笔记总结如有错误,请指正!谢谢