#include<iostream>
using namespace std;
class A{
public:
A(){ cout<<" A create\n";};
virtual ~A(){ cout<<"A delete\n";};
virtual void print(){ cout<<"This is A\n"; }
};
class B:public A{
public:
B(){ cout<<" B create\n";};
~B(){ cout<<"B delete\n";};
void print(){ cout<<"This is B\n";}
};
int main(){
A * p1 = new A;
A * p2 = new B;
p1->print(); //A
p2->print(); //B
delete p1;
delete p2;
system("pause");
return 0;
}
之前对虚函数一直一知半解,现在把总结的内容记录下来。C++的面向对象的一个特征就是多态,即一切用指向基类的指针来操作对象。指向基类的指针在操作它的多态时,会根据不同对象,调用其相应的函数,前提是这些函数都是虚函数。派生类指针调用派生类对象的时候则是正常的情况。
以上代码执行的结果如下:
A create
A create
B create
This is A
This is B
A delete
B delete
A delete
可以总结的知识点:1.如果为虚函数,派生类会覆盖基类的所对应的函数实现。2. 虚析构函数则不会被覆盖,即delete 基类对应的派生类指针时,先调用派生类的析构函数,再调用基类的虚析构函数。3. 构造函数不能定义为虚函数。
此时如果生成A a, B b,同时sizeof(a),sizeof(b),结果为4,这是因为虚函数内部实现使用指针,而将virtual去掉的话,结果都是1。