参考链接
https://blog.csdn.net/fyf18845165207/article/details/82697299
类中普通虚函数作用,实现多态
#include<iostream>
#include<stdlib.h>
using namespace std;
class A{
public:
virtual void print();//声明为虚函数
};
void A::print(){
cout<<"this is A"<<endl;
}
class B:public A{
public:
void print();
};
void B::print(){
cout<<"this is B"<<endl;
}
int main(){
A a;
B b;
A* p1=new A;
A* p2=new B;
p1->print();
p2->print();
system("pause");
return 0;
}
运行结果如下:实现多态
虚函数总结:
在实现多态的时候,不仅要有父类引用子类对象,还要有虚函数,我们只需把基类函数声明设为virtual,其派生类的相应函数也会成为虚函数。不需要在基类函数定义和派生类函数声明前再加关键字virtual.
纯虚函数也就是抽象函数,抽象函数所在的类为抽象类,只是一个特殊的类,为子类提供接口,抽象类无法实例化,只能通过继承机制,生成抽象类的非抽象派生类,再实例化。
虚析构函数
https://www.cnblogs.com/lit10050528/p/3874703.html
总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。
代码:
#include <iostream>
using namespace std;
class Base
{
public:
Base(){}
virtual ~Base()
{
cout << "Base Destructor." << endl;
}
private:
int a, b;
};
class Derive : public Base
{
public:
Derive()
{
pI = new int;
}
~Derive()
{
cout << "Derive Destructor." << endl;
// release memeory
if(pI != NULL)
{
delete pI;
}
}
private:
int *pI;
};
int main(void)
{
{
Base *pD = new Derive;
delete pD;
}
int i;
cin >> i;
return 0;
}
从运行结果可以看到,这次执行了父类和子类的析构函数,那么就不会造成内存泄露了。
对比总结
1. 普通虚函数只执行子类实现的函数;
2. 虚析构函数,同时执行子类和父类的析构函数;
为什么这样设计?
因为普通虚函数只需要重写(覆盖)原有父类的函数实现即可;而虚析构函数,涉及到类成员,而子类是集成了父类的成员的,所以虚析构函数也要被继承,才能保证成员的释放;这跟构造函数,子类会调用父类构造函数是一样的。