C++纯虚函数
Y.你壕 人气:0虚函数和纯虚函数
之前学过虚函数,语法:virtual 返回值类型 函数名(参数列表),然后这个类也就变成的虚基类,然后子类重写父类的虚函数。
纯虚函数,语法:virtual 返回值类型 函数名(参数列表)=0,当类中有了纯虚函数,这个类也称为抽象类。抽象类特点:无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类。
class Base { public: virtual void Examp() = 0;//纯虚函数 ~Base() { cout << "父类的析构函数" << endl; } }; class Son:public Base { public: void Examp() { cout << "重写了父类的纯虚函数" << endl; } ~Son() { cout << "子类的析构函数" << endl; } }; int main() { Son p1; p1.Examp(); system("pause"); }
上面是最简单的纯虚函数代码,子类必须得重写重写抽象类中的纯虚函数,不然不能实例化对象。
接下来我们如果利用子类对象开辟堆区,那么会带来父类指针释放子类对象时不干净的问题,即子类的析构函数不能够正常的被调用,会带来内存泄漏的问题:
int main() { Son *p1=new Son;//子类对象开辟堆区 p1->Examp(); delete p1;//释放堆区,自动调用析构函数 system("pause"); }
为了解决这个问题,可以利用虚析构和纯虚析构,也很简单,直接在父类的析构函数前面加上virtual关键字就成为了虚析构函数,这个类也会成为抽象类。
class Base { public: virtual void Examp() = 0;//纯虚函数 virtual ~Base()//虚析构 { cout << "父类的析构函数" << endl; } };
或者是利用纯虚析构
class Base { public: virtual void Examp() = 0;//纯虚函数 virtual ~Base() = 0;//类内声明 }; Base::~Base()//类外实现 { cout << "父类的析构函数" << endl; }
附:纯虚函数的应用
包含纯虚函数的类叫抽象类,它不能生成对象,用户不能创建类的实例,只能创建派生类的实例。
注明:纯虚函数必须在继承类中重新声明函数(去掉后面的0,否则该派生类也不能实例化)。就是基类告诉子类,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它。”
代码实现:
include<stdio.h> #include<iostream> using namespace std; class Base { public: virtual void func()=0; //在基类中声明纯虚函数 }; class Derived:public Base { public: void func() //在子类中重写纯虚函数 { cout<<"哈哈"<<endl; } }; int main() { Base *b=new Derived(); //基类的指针调用子类重写的纯虚函数 b->func(); return 0; }
总结
虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
加载全部内容