1.首先,说一下类的继承:
基类是CAnimal:
class CAnimal
{
protected:
CString m_cstrName = L"";
int m_nShoutNum = 3;
public:
CAnimal();
CAnimal(CString name);
~CAnimal();
public:
int GetShoutNum();
void SetShoutNum(int nValue);
virtual CString Shout();//先不看这个
};
2.然后写一下派生类CCat
代码如下:
#include "Animal.h"
class CCat:public CAnimal
{
public:
CCat(CString name);
CCat();
~CCat();
public:
CString Shout();
void SetShoutNum(int nValue);
};
主要是public继承。
还有派生类CDog
class CDog :
public CAnimal
{
public:
CDog();
CDog(CString name);
~CDog();
public:
CString Shout();
};
3.然后注意
GetShoutNum()函数是基类有的。
CString Shout();函数是派生类有的。
void SetShoutNum(int nValue);函数是派生类和基类都有的。
4.关键时刻到了
CCat cat(L"234");
cat.SetShoutNum(4);//这里就会进派生类的SetShoutNum函数
CString cstrCatShout = cat.Shout();//这里毫无疑问就是进派生类的
CDog dog(L"123");
dog.SetShoutNum(2);//这里就会进基类的SetShoutNum函数
CString cstrCatShout = dog.Shout();//这里毫无疑问就是进派生类的
直接实例化的两个对象cat和dog。
调用的函数就是你重写了就调用派生类的。
你没有重写就调用基类的。
但是实例化的时候要实例化派生类
实例化基类就不行了。这就是继承。
5.关于多态。
多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
第一:子类以父类的身份出现。
第二:子类在工作时以自己的方式实现。
第三:子类以父类的身份出现时,子类特有的属性和方法不可以使用。(不清楚)
第四:纯虚函数是虚函数再加上=0;(可以不用在基类里实现该函数)
举例:纯虚函数:virtual void fun()=0;即抽象类!必须在子类实现这个函数,即先有名称,没有内容,在派生类中实现内容。
第五:抽象类是指包括至少一个纯虚函数的类。
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。
这是通过在该成员的返回类型之前添加virtual关键字来实现的。
解释一下上面的那段话,就是实例化一个基类。
然后基类调用的函数都是基类自带的。
但是如果基类想用派生类的函数,就需要在基类里写一个虚函数。(前面加virtual)
举例如下:
CAnimal *testAnimal1 = new CCat(L"咪咪");
testAnimal1->SetShoutNum(2);//这个函数就只会调用基类的
CString cstrAnimalShout=testAnimal1->Shout();//这个就会调用派生类的
CAnimal *testAnimal2 = new CDog(L"小黑");
testAnimal2->SetShoutNum(3);
cstrAnimalShout = testAnimal2->Shout();//这个就会调用派生类的
实例化的时候不同,Shout函数使用的是不同派生类的。这个就是多态。
程序会自动去找new的对象是什么,然后这个对象的Shout()函数是什么。