c++虚函数

来源:互联网 发布:小学生的网络安全教育 编辑:程序博客网 时间:2024/05/18 21:08
#include <iostream>


using namespace std;


class Base {
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
};


typedef void(*Fun)(void);


int main()
{
        Base b;
        Fun pFun = NULL;
        cout << "V-Table: " << (int*)(&b) << endl;
        cout << "V-Table --The First Function: " << (int*)*(int*)(&b) << endl;
        pFun = (Fun)*((int*)*(int*)(&b));
        pFun();


        ((Fun)*((int*)*(int*)(&b)+0))(); // Base::f()
        ((Fun)*((int*)*(int*)(&b)+1))(); // Base::g()
        ((Fun)*((int*)*(int*)(&b)+2))(); // Base::h()
        return 0;

}

====================================================================================================================================

V-Table: 0xbfc65298
V-Table --The First Function: 0x80489c0
Base::f
Base::f
Base::g
Base::h

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <iostream>


using namespace std;


class basic{
private:
public:
        basic(){cout << "Construct basic\n";}
//      ~basic(){cout << "Deconstruct basic\n";}
        virtual void show(int i= 10){cout << "In basic, and i = "<< i << endl;return;}
        virtual ~basic(){ cout << "In virutal decontruct basic\n";}
        virtual void show_basic(){cout << "In basic, show_basic\n";}
};


class sub_basic: public basic{
private:
public:
        sub_basic(){cout << "Construct sub_basic\n";}
//      ~sub_basic(){cout << "Deconstruct sub_basic\n";}
        void show(int i = 99){cout << "In sub_basic, and i = " << i << endl;return;}
        virtual ~sub_basic(){cout << "In virtual deconstruct sub_basic\n";}
};


int main()
{
        basic * pb = new sub_basic;
        sub_basic *pb_s = dynamic_cast<sub_basic*>(pb);
        pb->show();
//      pb->show_basic();
        pb_s->show();
        delete pb;
        return 0;
}

====================================================================================================================================

Construct basic
Construct sub_basic
In sub_basic, and i = 10
In sub_basic, and i = 99
In virtual deconstruct sub_basic
In virutal decontruct basic

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <iostream>


using namespace std;


class basic{
private:
public:
//      basic(){cout << "Construct basic\n";}
//      ~basic(){cout << "Deconstruct basic\n";}
        virtual void show(){cout << "In basic, show()"<< flush<<endl;}
        virtual void show_basic(){cout << "In basic, show_basic\n"<<flush;}
        virtual void first(){cout<<"In basic, in first()\n"<<flush;}
        void second(void){cout<<"Basic, in second()\n"<<flush;}
        virtual void third(){cout<<"In basic, in third()\n"<<flush;}
        void forth(void){cout << "Basic, in forth()\n"<<flush;}
//      virtual ~basic(){ cout << "In virutal decontruct basic\n"<<flush;}
};




class sub_basic: public basic{
private:
public:
//      sub_basic(){cout << "Construct sub_basic\n";}
//      ~sub_basic(){cout << "Deconstruct sub_basic\n";}
        virtual void show(int i = 99){cout << "In sub_basic, show()"<< endl<<flush;}
        virtual void show_basic(){cout << "In sub_basic, show_basic()\n"<<flush;}
        virtual void first(){cout<<"In sub_basic, in first()\n"<<flush;}
        virtual void third(void){cout<<"In sub_basic, in third()\n"<<flush;}
//      virtual ~sub_basic(){cout << "In virtual deconstruct sub_basic\n";}
};


typedef void(* pFunc)(void);
int main()
{
        basic * pb = new sub_basic;
        sub_basic *pb_s = dynamic_cast<sub_basic*>(pb);
        pb->show();
        pb->show_basic();
        pb_s->show();
        delete pb;
        cout << sizeof(basic)<< endl;
        cout << sizeof(sub_basic) << endl;
        sub_basic var;
        cout<<endl<<endl<<"Begin to test\n"<<flush;
        ((pFunc)*((int*)*(int*)(&var)+0))();
        ((pFunc)*((int*)*(int*)(&var)+1))();
        ((pFunc)*((int*)*(int*)(&var)+2))();
        ((pFunc)*((int*)*(int*)(&var)+3))();
//      ((pFunc)*((int*)*(int*)(&var)+4))();
//      ((pFunc)*((int*)*(int*)(&var)+5))();
//      ((pFunc)*((int*)*(int*)(&var)+6))();
//      ((pFunc)*((int*)*(int*)(&var)+7))();
        cout<< "Finish testing"<<flush<<endl<<endl;
        return 0;
}


原创粉丝点击