2014/10/11 C++の継承とかについてメモ

C++

C++についてのメモ,主に継承、多態性について
例えば、Animalクラスを実装し、Dogクラス、Catクラスと作りたい時。
以下のように実装したとしましょう。

Animal.h
				
#include "stdio.h"

class Animal{
public:
	void cry(){
		printf("Animal!");
	};
};
class Cat : public Animal{
public:
	void cry() {
		printf("Nyan!");
	}
};
class Dog :public Animal{
public:
	void cry(){
		printf("Wan!");
	}
};			    
			

さて、このように実装した後、Main関数を以下のようにしたとします。

				
#include "Animal.h"
#include "stdio.h"

int main(void){
	Animal *an = new Animal();
	Animal *an_c = new Cat();
	Animal *an_d = new Dog();
	
	an->cry();
	an_c->cry();
	an_d->cry();

	delete an,an_c,an_d;
	getchar();
	return 0;
}
			    
			
期待される結果は、Animal!Nyan!Wan!ですが、
実際には、Animal!Animal!Animal!となってしまいます。

これは仮想関数を使用していないためです。
ですので、基底クラスにオブジェクトごとに振る舞いを変えたいと思う関数にvirtualキーワードをつけてあげましょう。
修正後のコードは以下の通り。

				
#include "stdio.h"

class Animal{
public:
	virtual void cry(){//virtual追加
		printf("Animal!");
	};
};
class Cat : public Animal{
public:
	void cry() {
		printf("Nyan!");
	}
};
class Dog :public Animal{
public:
	void cry(){
		printf("Wan!");
	}
};
			    
			

これで、期待通りの結果になります。
最後に・・・
C++の継承は、公開派生やアクセス修飾子、フレンドあたりがこんがらがりそう・・・。