虚函数

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的话,只能释放父类对象的内存空间,不能释放子类对象的内存空间。
}
posted @ 2018-06-05 10:58  小石王  阅读(248)  评论(0编辑  收藏  举报