一 虚函数
增加程序的扩展性
class Parent {
public:
void test() {
cout << "parent" << endl;
}
};
class Child :public Parent {
public:
void test() {
cout << "child" << endl;
}
};
Parent *c = new Child();
// 编译期间 确定c 为 parent 调用parent的test方法
c->test();
//修改Parent为virtual 虚函数 动态链接,告诉编译器不要静态链接到该函数
virtual void test() {
cout << "parent" << endl;
}
//动态多态 调用Child的test方法
c->test();
构造函数任何时候都不可以声明为虚函数
析构函数一般都是虚函数,释放先执行子类再执行父类
二 虚函数引发的内存泄漏:
则在virtualFun函数中通过父类指针操作子类对象的成员函数的时候是没有问题的,可是在销毁对象内存的时候则只是执行了父类的析构函数,子类的析构函数却没有执行,这会导致内存泄漏
void zipFun() {
//用父类的指针来出事话一个子类的对象
Plane *jet = new Copter();
//调用了子类中的虚函数
jet->land();
//回收
delete jet;
jet = nullptr; //这种情况存在内存泄漏的可能
}
调用后打印:没有走子类Copter的析构函数
Plane 无参构造函数00905A08湾流1991
Copter 无参构造函数湾流1991
Copter land
Plane 析构函数00905A08湾流1991
解决方法 将Plane 和Copter 的析构函数都声明为虚函数(.h声明中加上virtual关键字)
三 纯虚函数
//纯虚函数
virtual void test() = 0;
- 当一个类具有一个纯虚函数,这个类就是抽象类
- 抽象类不能实例化对象
- 子类继承抽象类,必须要实现纯虚函数,如果没有,子类也是抽象类
- 一个类中只有纯虚函数,那么它是一个接口
- 抽象类的作用:为了继承约束,根本不知道未来的实现
class Parent {
public:
//纯虚函数 继承自这个类需要实现 抽象类型
virtual void test() = 0;
};
class Child :public Parent {
public:
void test(){}
};