仮想関数のしくみ

仮想関数の特徴

	struct A {
		virtual void print(){cout << "A\n"}
	};
	struct B : A {
		void print(){cout << "B\n"}
	};
		A* p = new B;
		p->print();	// Bと表示される。

確認

仮想関数が1つでもあると、オブジェクトには仮想関数テーブル(クラスに1つできる)の 先頭のアドレスを指すポインタ変数が追加される。また、仮想関数の呼び出しは、
	p->print();	→	(p->*(p->vfptr[0]))();
というように変形されているように呼び出される。 ([0]は仮想関数テーブルの1番目の関数を意味している。)
これによって、仮想関数呼び出しが実現できることを 確認してみよう。

演習

頭の中で考えてみよう!
    struct A {
    	virtual void func(){print();}
    	void print(){cout << "A\n";}
    };
    struct B : A {
    	void func(){print();}	// (ア)
    	void print(){cout << "B\n";}
    };
    

  1. 「A* p = new B; p->func();」としたときの出力を答えよ。 ...
  2. (1)で(ア)がない場合の出力を答えよ。 ...

    struct A {
    	void func(){print();}
    	virtual void print(){cout << "A\n";}
    };
    struct B : A {
    	void func(){print();}	// (イ)
    	void print(){cout << "B\n";}
    };
    

  3. 「A* p = new B; p->func();」としたときの出力を答えよ。 ...
  4. (3)で(イ)がない場合の出力を答えよ。 ...

    struct A {
    	(ウ)~A(){print();}
    	(エ)void print(){cout << "A\n";}
    };
    struct B : A {
    	~B(){print();}
    	void print(){cout << "B\n";}
    };
    

  5. 「A* p = new B; delete p;」としたときの出力を答えよ。 ...
  6. (5)で(ウ)にvirtualと指定した場合の出力を答えよ。 ...
  7. (5)で(エ)にvirtualと指定した場合の出力を答えよ。 ...
ヒント

戻る