随笔-60  评论-98  文章-0  trackbacks-0

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

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

 9}
;
10//-------------------------------------------------------------------------
11class IDog // 抽象类,狗
12{
13public:
14    virtual void Barking() = 0// 所有的狗都会吠
15}
;
16//-------------------------------------------------------------------------
17class 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//-------------------------------------------------------------------------

测试代码
1private:
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出的子类对象指针发生缺失,连一只虱子、跳蚤都不会少。
posted on 2008-09-20 11:22 创建更好的解决方案 阅读(1472) 评论(2)  编辑 收藏 引用 所属分类: 面向对象C++专栏理越辩越明

评论:
# re: 狗,哈士奇,跳蚤,继承,聚合,UpCast和DownCast 2008-09-20 14:37 | jef
不错啊,挺有创意.要是能出个全集就好了.  回复  更多评论
  
# re: 狗,哈士奇,跳蚤,继承,聚合,UpCast和DownCast 2008-09-20 14:47 | cexer
多重继承的时候,使用C风格的转换,可能会出乱子。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理