1.纯虚函数的概念
只有声明,没有函数体的虚函数。纯虚函数在父类中声明,需要在子类中中去具体实现。
语法为virtual void PureVirtualFunc() = 0;
=0为纯虚函数的格式,类似于这是一个空的函数指针;
2.抽象类
拥有一个及以上纯虚函数后的类就成为了抽象类;
抽象类不能用于实例化对象,因为类里边有函数没有实现,是不完整的类,所以不能用于定义对象;
抽象类可以用来定义指针;因为抽象类毕竟是个类型,当然可以用来定义指针,
然而抽象类定义的指针并没有当前类类型的对象被该指针所指向,因为抽象类不能定义对象,所以抽象类只能用来对派生类服务;
// 只要子类中有一个纯虚函数没有实现,那么这个子类就无法实例化对象
// 不管这个纯虚函数是在自己类中声明的还是继承过来的
// 纯虚函数与抽象类
#include <iostream>
#include <string>// 拥有一个及以上纯虚函数后的类就成为了抽象类
class Father
{
public:Father() {}~Father() {}// 如果所有的函数都为纯虚函数可以将这个类理解为纯虚类// 但是一般没有虚类和纯虚类概念,因为纯虚类也就是抽象类virtual void PureVirtualFunc() = 0;
};class Son : public Father
{
public:Son() {}~Son() {}// 如果子类没有将父类中的纯虚函数全部实现,则这个子类也是抽象类,也无法定义对象// 就是说只要类里边有纯虚函数就不能实例化对象,不管这个纯虚函数是自己声明的还是继承来的 void PureVirtualFunc() {}
};class Son1 : public Father
{
public:Son1() {}~Son1() {}// 如果子类没有将父类中的纯虚函数全部实现,则这个子类也是抽象类,也无法定义对象void PureVirtualFunc();
};int main()
{// 抽象类不能用于定义对象// Father obj_father;// 抽象类可以用啦定义指针Father *p_father;Son obj_son;// Son1无法实例化对象// 如果子类没有将父类中的纯虚函数全部实现,则这个子类也是抽象类,也无法定义对象// 就是说只要类里边有纯虚函数就不能实例化对象,不管这个纯虚函数是自己声明的还是继承来的// Son1 obj_son1;return 0;
}
// 纯虚函数与抽象类
#include <iostream>
#include <string>
using namespace std;
// 拥有一个及以上纯虚函数后的类就成为了抽象类
class Father
{
public:Father() {cout << "Father::Father()" << endl;}~Father() {cout << "Father::~Father()" << endl;}// 如果所有的函数都为纯虚函数可以将这个类理解为纯虚类// 但是一般没有虚类和纯虚类概念,因为纯虚类也就是抽象类virtual void PureVirtualFunc() = 0;
};// 继承父类
class Son : public Father
{
public:Son() {cout << "Son::Son()" << endl;}~Son() {cout << "Son::~Son()" << endl;}void PureVirtualFunc() {cout << "Son::PureVirtualFunc()" << endl;}
};// 继承子类
class GSon : public Son
{
public:GSon() {cout << "GSon::GSon()" << endl;}~GSon() {cout << "GSon::~GSon()" << endl;}void PureVirtualFunc() {cout << "GSon::PureVirtualFunc()" << endl;}
};int main()
{Father *p_father;Son obj_son;cout << "子类类型直接调用自己定义的纯虚函数:" << endl;obj_son.PureVirtualFunc();// 父类指针调用子类定义的纯虚函数cout << "父类类型指针指向子类:" << endl;p_father = &obj_son;p_father->PureVirtualFunc();Son *p_son;GSon obj_gson;p_son = &obj_gson;// 输出结果:GSon::PureVirtualFunc()// 说明指针调用的虚函数定义是在指针指向对象的类型中定义的// 也就是说Father中声明的纯虚函数经过Son继承后,还可以继续被Gson继承p_son->PureVirtualFunc();return 0;
}
// 纯虚函数与抽象类
// 只要子类中有一个纯虚函数没有实现,那么这个子类就无法实例化对象
// 不管这个纯虚函数是在自己类中声明的还是继承过来的
#include <iostream>
#include <string>
using namespace std;
// 拥有一个及以上纯虚函数后的类就成为了抽象类
class Father
{
public:Father() {cout << "Father::Father()" << endl;}~Father() {cout << "Father::~Father()" << endl;}// 如果所有的函数都为纯虚函数可以将这个类理解为纯虚类// 但是一般没有虚类和纯虚类概念,因为纯虚类也就是抽象类virtual void PureVirtualFunc() = 0;// 只要子类中有一个纯虚函数没有实现,那么这个子类就无法实例化对象virtual void PureVirtualFunc1() = 0;
};// 继承父类
class Son : public Father
{
public:Son() {cout << "Son::Son()" << endl;}~Son() {cout << "Son::~Son()" << endl;}void PureVirtualFunc() {cout << "Son::PureVirtualFunc()" << endl;}
};int main()
{Father *p_father;// 只要子类中有一个纯虚函数没有实现,那么这个子类就无法实例化对象// 不管这个纯虚函数是在自己类中声明的还是继承过来的// Son obj_son;return 0;
}