1.虚函数的关键字virtual只能用在声明的地方,实现的地方不用加
class Base{
public:
virtual void show();
};
void Base::show(){
cout << "Base show" << endl;
}
2.父类的虚函数,子类继承后,在子类中也是虚函数
class Base的虚函数show,在被class D继承后,在class D中也是虚函数,所以执行结果才是调用了class C的show方法。在class D中声明show的时候,为了增加可读性,也可以加上virtual,和不加的效果是一样的。
#include <iostream>
using namespace std;
class Base{
public:
virtual void show();//{
// cout << "Base show" << endl;
//}
};
void Base::show(){
cout << "Base show" << endl;
}
class D : public Base{
public:
void show(){//这里可以加上virtual
cout << "D show" << endl;
}
};
class C : public D{
public:
void show(){
cout << "C show" << endl;
}
};
int main(){
C d;
Base *pb;
pb = &d;
pb->show();//打印出来的是:C show
}
3.虚函数只能是类的成员函数,它就是为了实现多态而生的。不能是全局函数。
4.静态(static)函数不可以是虚函数
5.内联函数不可以是虚函数
6.父类的析构函数必须是虚函数。
动态创建父类的时候,当delete父类对象的时候,不会自动释放子类对象,造成内存泄漏;
不是动态创建父类的时候,当delete父类对象的时候,会自动释放子类对象,不会造成内存泄漏;
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "create Base" << endl;
}
virtual ~Base(){//不加virtual的话,动态创建父类对象后,delete父类对象时,不能释放子类对象
cout << "free Base" << endl;
}
virtual Base* show(){
cout << "Base show" << endl;
return this;
}
};
class D : public Base{
public:
D(){
cout << "create D" << endl;
}
~D(){
cout << "free D" << endl;
}
D* show(){
cout << "D show" << endl;
return this;
}
};
int main(){
D d;
Base* pb = &d;
pb->show();
Base* p = new D;
delete p;//Base类的析构函数不用virtual的话,只能释放父类对象的内存空间,不能释放子类对象的内存空间。
}