狗,哈士奇,跳蚤,继承,聚合,UpCast和DownCast

狗,哈士奇,跳蚤,继承,聚合,UpCast和DownCast

 类的声明和实现文件,很简单,看注释吧,不多解释了

 1 // ---------------------------------------------------------------------------
 2 class  TFlea  //  跳蚤实现类
 3 {
 4public:
 5    void MakeSound() // 只会叫我在这里
 6    {
 7        ShowMessage("Flea Here:)");
 8    }

 9}
;
10 // -------------------------------------------------------------------------
11 class  IDog  //  抽象类,狗
12 {
13public:
14    virtual void Barking() = 0// 所有的狗都会吠
15}
;
16 // -------------------------------------------------------------------------
17 class  THusky :  public  IDog  //  哈士奇实现类,从IDog继承
18 {
19public:
20    virtual void Barking()
21    {
22        ShowMessage(m_sName); // 哈士奇会说自己的名字
23    }

24public:
25    THusky(String &sName) // 每个哈士奇都有名字
26    {
27        m_Flea = new TFlea(); // 生下来身上就有一只跳蚤
28        if (NULL == m_Flea)
29        {
30            ShowMessage("Create husky failed!");
31            delete this;
32        }

33        m_sName = sName;
34    }

35public:
36    TFlea *m_Flea; // 聚合了一只跳蚤
37    String m_sName; // 名字
38}
;
39 // -------------------------------------------------------------------------

测试代码
1 private :
2     vector < IDog  *>  m_vDogs;  //  测试类中的狗索引容器

 1     m_vDogs.reserve( 20 );
 2      //  创建10只狗
 3      for  (unsigned  int  i  =   0 ; i  <   10 ; i ++ )
 4      {
 5        String sDogName = "Husky: " + (String)(i); // 名字为其创建的序号
 6        IDog *Dog = (IDog *)new THusky(sDogName);
 7        if (NULL == Dog)
 8        {
 9            String sInfo = sDogName + (String)(" Create Failed!");
10            ShowMessage(sInfo);
11        }

12        m_vDogs.push_back(Dog);
13    }

1      //  查看第10只狗的名字,它在9号位
2     THusky  * Husky  =  (THusky  * )m_vDogs[ 9 ];
3     String sName  =  Husky -> m_sName;
4      //  跳蚤还在不在
5     Husky -> m_Flea -> MakeSound();

运行结果显示:Flea Here
验证了结果是:指向子类对象的父类指针,在做DownCast时,不会因为自身是父类指针而使DownCast出的子类对象指针发生缺失,连一只虱子、跳蚤都不会少。

你可能感兴趣的:(狗,哈士奇,跳蚤,继承,聚合,UpCast和DownCast)