Polymorphism
実は理解しているつもりが、してないような気もしてるので少し練習。
#include <iostream> #include <string> class Base { public: virtual void say_name() { std::cout << "オレを呼ぶな" << std::endl; } }; class Circle : public Base { public: void say_name() { std::cout << "オレは円だ" << std::endl; } }; class Square : public Base { public: void say_name() { std::cout << "オレは四角だ" << std::endl; } }; int main(int argc, char** argv) { Base* base = new Base(); Base* circle = new Circle(); Base* square = new Square(); Base* array[3] = {base, circle, square}; for (int i = 0; i < 3; i++) { array[i]->say_name(); } delete base; delete circle; delete square; return 0; }
もし、Baseクラスのsay_nameメンバ関数にvirtualキーワードを付けていないと、
オレを呼ぶな
オレを呼ぶな
オレを呼ぶな
となり、所望の動作をしない。
virtualキーワードを付けていると、
オレを呼ぶな
オレは円だ
オレは四角だ
となって、ちゃんと適切な型にBindingしてくれる。
ま、予想通りではあるのだけど、Polymorphismの意味について、ボクは誤解していたらしい。
というのも、ボクはこのような場合もPolymorphismだと思ってた(そして、使ってた)。
int main(int argc, char** argv) { Circle circle; circle.say_name(); return 0; }
これは、ただ子クラスのオブジェクトを作っていただけで、Polymorphismとは言いませんよ!!
いい加減な知識ではダメダメっすね。