虚函数
关键字 virtual 用于在类中说明虚函数。
我们来看一个例子:
using namespace std; class Point { public: //可以将下面两行代码的注释解开看看差别就能明白虚函数的作用 //virtual void show() //void show() virtual void show() { cout<<"Point"<<endl; } }; class Square:public Point { public: void show() { cout<<"Square"<<endl; } }; //程序分析: //我们将一个派生类的地址即&sqObj赋值给基类的指针即Point* pObj。当基类的指针指向派生类的对象时,基类的指针只能访问派生类对象从基类继承下来的成员,所以当执行pObj->show();执行的是Point类的show()方法。 //如何解决这个问题,使用虚函数 用关键字virtual //简单说就是不加virtual关键字调用的是Point类的show()方法,加了关键字之后调用的是Square类的show()方法 int main(int argc, const char * argv[]) { Point* pObj; Square sqObj; pObj = &sqObj; pObj->show(); return 0; }
代码下载: http://pan.baidu.com/share/link?shareid=552980530&uk=3189484501
纯虚函数与抽象类
using namespace std; //在纯虚函数中,不能提供出函数的具体实现,而是需要在派生类中再加以实现。 //一个类中可以有多个纯虚函数,包含纯虚函数的类称为抽象类。一个抽象类只能作为基类来派生新类,而不能说明抽象累的对象。 //简单说抽象类只能用来继承 class A { public: //下面就是一个纯虚函数 virtual void Show() = 0; }; class B:public A { public: void Show() { cout<<"BBB"<<endl; } }; int main(int argc, const char * argv[]) { B bn; bn.Show(); return 0; }
代码下载: http://pan.baidu.com/share/link?shareid=837517146&uk=3189484501
虚析构函数
using namespace std; //在C++中,构造函数不能被声明为虚函数,但是析构函数可以被声明为虚函数。只要基类的析构函数被声明为虚函数了,则它的派生类的析构函数,无论是否使用了virtual,都将自动被说明为虚函数。 //当使用delete运算符和析构函数一起使用时,delete一个对象,则delete隐含对析构函数的调用,如果析构函数不是虚函数,则子类的对象的析构函数将不会被调用自动调用。 //就是用delete会调用析构函数,如果基类这里即(类A)析构函数如果不是虚函数的话,派生类即(B类)就不会被调用。 class A { public: A() { cout<<"A构造函数"<<endl; } virtual ~A() { cout<<"A析构函数"<<endl; } }; class B: public A { public: B() { cout<<"B构造函数"<<endl; } ~B() { cout<<"B析构函数"<<endl; } }; int main(int argc, const char * argv[]) { //多态的特性 基类的指针可以指向派生类 A* pb = new B(); delete pb; return 0; }
代码下载: http://pan.baidu.com/share/link?shareid=1038301432&uk=3189484501