class C{
public:
C(void);
virtual ~C(void);
virtual void F(void) = 0;
virtual void G(void) = 0;
virtual void H(void) = 0;
};
class D : public C{
public:
D(void);
virtual ~D(void);
virtual void F(void);
virtual void G(void);
virtual void H(void);
};
class E : public D{
public:
E(void);
virtual ~E(void);
virtual void F(void);
virtual void G(void);
virtual void H(void);
};
#include <iostream>
using namespace std;
C :: C(void){}
C :: ~C(void){}
D :: D(void) : C(){}
D :: ~D(void) {}
D :: F(void){ cout << "D :: F" << endl; }
D :: G(void){ F(); }
D :: H(void){ G(); }
E :: E(void) : D(){}
E :: ~E(void) {}
E :: F(void){ D :: F(); cout << "E :: F" << endl; }
E :: G(void){ D :: G(); }
E :: H(void){ D :: H(); }
#include <iostream>
using namespace std;
int main(void){
C *c = new E();
c -> F();
c -> G();
c -> H();
delete c;
return 0;
}
これが、
D :: F
E :: F
D :: F
E :: F
D :: F
E :: F
こうなる。
E :: F -> D :: F
E :: G -> D :: G -> E :: F -> D :: F
E :: H -> D :: H -> E :: G -> D :: G -> E :: F -> D :: F
と呼び出されているようだ。つまり、
D :: G()
で呼び出しているF()
はE :: F()
になっていて、 D :: H()
で呼び出しているG()
はE :: G()
になっている。
仮想関数テーブルってむずかし。
D :: F(void){ cout << "D :: F" << endl; }
D :: G(void){ D :: F(); }
D :: H(void){ D :: G(); }
こうするといい感じ。
( ´゚д゚`)えーーー