当前位置:编程学习 > 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
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,