程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 類在繼承中虛函數、純虛函數、普通函數,三者的區別

C++ 類在繼承中虛函數、純虛函數、普通函數,三者的區別

編輯:C++入門知識

C++ 類在繼承中虛函數、純虛函數、普通函數,三者的區別


1.虛函數(impure virtual)     C++的虛函數主要作用是“運行時多態”,父類中提供虛函數的實現,為子類提供默認的函數實現。     子類可以重寫父類的虛函數實現子類的特殊化。     如下就是一個父類中的虛函數:    
class A
{
public:
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};
 

 

  2.純虛函數(pure virtual)     C++中包含純虛函數的類,被稱為是“抽象類”。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。     C++中的純虛函數更像是“只提供申明,沒有實現”,是對子類的約束,是“接口繼承”。     C++中的純虛函數也是一種“運行時多態”。     如下面的類包含純虛函數,就是“抽象類”:    
class A
{
public:
    virtual void out1(string s)=0;
    virtual void out2(string s)
    {
        cout<<"A(out2):"<<s<<endl;
    }
};

 

    3.普通函數(no-virtual)     普通函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的“字面值”類對象,調用自己的普通函數。     普通函數是父類為子類提供的“強制實現”。     因此,在繼承關系中,子類不應該重寫父類的普通函數,因為函數的調用至於類對象的字面值有關。   4.程序綜合實例    
#include <iostream>using namespace std;class A
{
public:
    virtual void out1()=0;  ///由子類實現
    virtual ~A(){};
    virtual void out2() ///默認實現
    {
        cout<<"A(out2)"<<endl;
    }
    void out3() ///強制實現    
    {
        cout<<"A(out3)"<<endl;
    }
};
class B:public A
{
public:
    virtual ~B(){};    
    void out1()
    {
        cout<<"B(out1)"<<endl;
    }    
    void out2()
    {
        cout<<"B(out2)"<<endl;
    }    
    void out3()
    {
        cout<<"B(out3)"<<endl;
    }
};
int main()
{
    A *ab=new B;
    ab->out1();
    ab->out2();
    ab->out3();
    cout<<"************************"<<endl;
    B *bb=new B;
    bb->out1();
    bb->out2();
    bb->out3();

    delete ab;
    delete bb;    
    return 0;
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved