繼承
繼承使得所有子類公共的部分都放在了父類,代碼得到了共享
只有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;
}