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,和不加的效果是一样的。
#includeusing 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父类对象的时候,会自动释放子类对象,不会造成内存泄漏;#includeusing 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的话,只能释放父类对象的内存空间,不能释放子类对象的内存空间。 }