目的
方法
- 子クラスのポインタを親クラスのポインタに代入するのがミソ.(子クラスは親クラスのポインタに代入可能.逆はだめ.)
- それを使う側は親クラスのポインタを引数なりにして受け取って,親クラスのメソッドを呼ぶ.
- その時に,親クラスでvirtual宣言しておけば,親クラスのポインタであっても,実態が子クラスのポインタである場合は子クラスのメソッドを実行する.
- これで,分岐したい処理の分だけ子クラスで分岐できる.
- virtual付けたときと付けないときの違いは下記を参照.virtual付けていないと親クラスのメソッドが実行される.
class Parent {
protected:
int x_;
public:
int get_x() const {return x_;}
void set_x(int x) {x_ = x;}
void non_virtual_func() {cout << "I'm parent.\n";}
virtual void virtual_func() {cout << "I'm parent.\n";}
Parent(int x): x_(x) {}
};
class Child : public Parent {
public:
void non_virtual_func() {cout << "I'm child.\n";}
virtual void virtual_func() {cout << "I'm child.\n";}
public:
Child(int x) : Parent(x) {}
};
int main()
{
Parent* p = new Child(1);
cout << "non virtual function call: ";
p->non_virtual_func();
cout << "virtual function call: ";
p->virtual_func();
return 0;
}