虚函数


关键字   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