類的聲明和實現文件,很簡單,看注釋吧,不多解釋了
1
//---------------------------------------------------------------------------
2
class TFlea // 跳蚤實現類
3

{
4
public:
5
void MakeSound() // 只會叫我在這里
6
{
7
ShowMessage("Flea Here:)");
8
}
9
};
10
//-------------------------------------------------------------------------
11
class IDog // 抽象類,狗
12

{
13
public:
14
virtual void Barking() = 0; // 所有的狗都會吠
15
};
16
//-------------------------------------------------------------------------
17
class THusky : public IDog // 哈士奇實現類,從IDog繼承
18

{
19
public:
20
virtual void Barking()
21
{
22
ShowMessage(m_sName); // 哈士奇會說自己的名字
23
}
24
public:
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
}
35
public:
36
TFlea *m_Flea; // 聚合了一只跳蚤
37
String m_sName; // 名字
38
};
39
//-------------------------------------------------------------------------

2

3



4

5

6



7

8

9

10

11

12



13

14

15

16

17

18



19

20

21



22

23

24

25

26



27

28

29



30

31

32

33

34

35

36

37

38

39

測試代碼
1
private:
2
vector<IDog *> m_vDogs; // 測試類中的狗索引容器

2

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
}

2

3

4



5

6

7

8



9

10

11

12

13

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

2

3

4

5

運行結果顯示:Flea Here
驗證了結果是:指向子類對象的父類指針,在做DownCast時,不會因為自身是父類指針而使DownCast出的子類對象指針發生缺失,連一只虱子、跳蚤都不會少。