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とは言いませんよ!!


いい加減な知識ではダメダメっすね。