繼承,多態

繼承

繼承使得所有子類公共的部分都放在了父類,代碼得到了共享

只有is-a的時候纔是使用繼承最好的時候

父類的構造方法只能調用,不能繼承

子類擁有父類非private的屬性和功能,子類可以不同於的屬性 和功能,

#include<iostream>
#include<string>
using namespace std;
class Animal
{
protected:
	string name="";
	int shoutNum=3;
public:
	Animal(string name)
	{
		this->name=name;
	}
	Animal()
	{
		this->name="無名";
	}
	int ShoutNum(int num)
	{
		this->shoutNum=num;
		return shoutNum;
	}
};

class Cat:public Animal
{
public:
	Cat():Animal(){}
	Cat(string name):Animal(name){}
	string Shout()
	{
		string result="";
		for(int i=0;i<shoutNum;i++)
		{
			result+="喵, "; 
		}
		return  "我的名字叫"+name+" "+result;
	}
};

class Dog:public Animal//不聲明爲public則爲公有繼承 
{
public:
	Dog():Animal(){}
	Dog(string name):Animal(name){}
	string Shout()
	{
		string result="";
		for(int i=0;i<shoutNum;i++)
		{
			result+="汪, "; 
		}
		return  "我的名字叫"+name+" "+result;
	}
};

int main()
{
	Cat *cat=new Cat("小花");
	cat->ShoutNum(1); 
	cout<<cat->Shout();
	Dog *dog=new Dog("旺財");
	dog->ShoutNum(5);
	cout<<"\n"<<dog->Shout();
	return 0;
} 


多態

關鍵字virtual

多態的原理是當方法被調用時,無論對象是否被轉換爲其父類,都只有位於對象繼承鏈最末端的方法實現會被調用。也就是說,虛方法是按照其運行時類型而編譯時類型進行動態綁定調用的

#include<iostream>
#include<string>
using namespace std;
class Animal
{
protected:
	string name="";
	int shoutNum=3;
public:
	Animal(string name)
	{
		this->name=name;
	}
	Animal()
	{
		this->name="無名";
	}
	int ShoutNum(int num)
	{
		this->shoutNum=num;
		return shoutNum;
	}
string Shout()
	{
		string result="";
		for(int i=0;i<shoutNum;i++)
		{
			result+=getSound()+", "; 
		}
		return  "我的名字叫"+name+" "+result+"\n";	
	}
	virtual string getSound()//不加virtual會調用到父類來, 因爲是Animal類型的指針
	{
		return "";
	}
/*
如果
	virtual string getSound()=0;
此類將會變成一個抽象類 
*/	
};
class Cat:public Animal
{
public:
	Cat():Animal(){}
	Cat(string name):Animal(name){}
	string getSound()
	{
		return "喵";
	}
};
class Dog:public Animal//不聲明爲public則爲私有繼承 
{
public:
	Dog():Animal(){}
	Dog(string name):Animal(name){}
	string getSound()
	{
		return "汪";
	}
};
int main()
{
	Animal* arrayAnimal[5];
	arrayAnimal[0]=new Cat();
	arrayAnimal[1]=new Dog();
	arrayAnimal[2]=new Cat("小花");
	arrayAnimal[3]=new Dog("陳勇");
	arrayAnimal[4]=new Cat("www");
	for(int i=0;i<5;i++)
	{
		arrayAnimal[i]->ShoutNum(i+1);
		cout<<arrayAnimal[i]->Shout();
	}
	Cat *cat =new Cat();
	cout<<cat->Shout(); 
	Animal *animal=new Animal();
	return 0;
}


#include<iostream>
#include<stdio.h>
class A
{
	public:
	int fun() 
	{std::cout<<"A"<<"\n";		}
};
class B:public A{
	public:
	 int fun()
	{std::cout<<"B"<<"\n";		}
};
int main()
{
	B b;
	b.fun();
	A a;
	a.fun();//兩個相同的函數AB會各自調用自己的
	b.A.fun();
	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章