C++ダイナミックバインド-マルチステート

2085 ワード

バインド:
バインドとは、関数呼び出しをアドレスに関連付けることです.
  • 通常のメンバー変数、メンバー関数、コンパイルが完了した場合、呼び出しアドレスが決定されます.
  • virtual関数のアドレスは不確定ですが、虚表のアドレスを特定できるだけで、virtual関数が書き換えられる可能性があります.
  • virtualの関数のみが動的バインドです.
  • ダイナミックバインドには、マルチステートという名前もあります.
  • 共通シーン:構造関数は虚関数として定義されます.(それ以外の場合は、親ポインタを定義して子クラスにアクセスし、最後に子クラスの空間ではなく親クラスの空間を解放してエラーが発生する可能性があります).
  • 親ポインタを使用して子クラスにアクセスする方法(関数)は、マルチステートvirtualのみです.
  • #include
    
    class Base
    {
    public:
    	int x;
    	Base()
    	{
    		x = 100;
    	}
    	void fun1(void)
    	{
    		printf("Base : fun1 
    "); } virtual void fun2(void) { printf("Base : virtual fun2
    "); } }; class Sub:public Base { public: int x; Sub() { x= 200; } void fun1(void) { printf("Sub : fun1
    "); } virtual void fun2(void) { printf("Sub : virtual fun2
    "); } }; void test(Base * pb) { int x = pb->x; printf("x = %d
    ",x); pb->fun1(); pb->fun2();// , 。 } int main(int argc,char *argv[]) { Base pb; test(&pb); Sub ps; test(&ps); return 0; }

    このプログラムはvirtualマルチステートを使用していません.呼び出すたびに親クラスのprintf()関数のみが呼び出されます.
    実行結果:
    Base: 100  200 Base: 111  222 Base: 77  88 Press any key to continue
    #include
    
    class Base
    {
    public:
    	int x;
    	int y;
    	Base()
    	{
    		x = 100;
    		y = 200;
    	}
    	void Print()
    	{
    		printf("Base: %d  %d
    ",x,y); } }; class Sub1:public Base { public: int a; Sub1() { x = 111; y = 222; a = 333; } void Print() { printf("sub1: %d %d
    ",x,y,a); } }; class Sub2:public Base { public: int b; Sub2() { x = 77; y = 88; b = 66; } void Print() { printf("sub2: %d %d
    ",x,y,b); } }; void test(void) { Base b; Sub1 s1; Sub2 s2; Base* arr[] = {&b,&s1,&s2}; int i; for(i=0; i<3;i++) { arr[i]->Print(); } } int main(int argc,char *argv[]) { test(); return 0; }

    virtualを加えて多態性を提示した結果,以下のようになった.
    Base: 100  200 sub1: 111  222  333 sub2: 77  88  66 Press any key to continue