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

C++之純虛函數詳解

編輯:C++入門知識

        如果基類定義了一個虛函數,而繼承類又沒有重載這個虛函數,那麼在基類和繼承類各自的虛函數表裡,  它們的虛函數地址是一樣的,而如果重載這個虛函數,兩個虛函數表裡面的虛函數的地址就不同。因此特地對這個說法在visual c 6.0 的平台下做了一個驗證。請看:
1、當繼承類沒有重載基類定義的虛函數時
#include<iostream.h>
class A
{
        public:
        virtual void f()
        {
                cout<<"class A"<<endl;
        };
};

class B:public A{};

int main()
{
        A *pa=new A;
        int *paadd=(int*)(*(int*)pa);
        int *paaddr=(int*)(*(int*)paadd);
        cout<<paaddr<<endl;
        A *pb=new B;
        int *pbadd=(int*)(*(int*)pb);
        int *pbaddr=(int*)(*(int*)pbadd);
        cout<<pbaddr<<endl;
        delete pa;
        delete pb;
        return 0
}

輸出確實一樣,都為0x00401028(注:不同的機器上地址可能不同)

2、當繼承類重載了基類定義的虛函數時
#include<iostream.h>
class A
{
        public:
        virtual void f()
        {
                cout<<"class A"<<endl;
        };
};
class B:public A
{
        public:
        virtual void f()
        {
                   cout<<"class B"<<endl;
        };
};
int main()
{
        A *pa=new A;
        cout<<sizeof(*pa)<<endl;
        int *paadd=(int*)(*(int*)pa);
        int *paaddr=(int*)(*(int*)paadd);
        cout<<paaddr<<endl;
        A *pb=new B;
        int *pbadd=(int*)(*(int*)pb);
        int *pbaddr=(int*)(*(int*)pbadd);
        cout<<pbaddr<<endl;
        delete pa;
        delete pb;
        return 0;
}
這時,基類的虛函數的地址為:0x00401028,而繼承類的虛函數地址為:0x00401032

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