1
+ /* Exercise 18.29:
2
+
3
+ Given the following class hierarchy:
4
+
5
+ class Class { ... }; class Base : public Class { ... };
6
+ class D1 : virtual public Base { ... };
7
+ class D2 : virtual public Base { ... };
8
+ class MI : public D1, public D2 { ... };
9
+ class Final : public MI, public Class { ... };
10
+
11
+ (a) In what order are constructors and destructors run on a Final object?
12
+ (b) A Final object has how many Base parts? How many Class parts?
13
+ (c) Which of the following assignments is a compile-time error?
14
+
15
+ Base *pb; Class *pc; MI *pmi; D2 *pd2;
16
+ (a) pb = new Class; (b) pc = new Final;
17
+ (c) pmi = pb; (d) pd2 = pmi;
18
+
19
+ Solution:
20
+ (a) Constructors run order: Class Base D1 D2 MI Class Final.
21
+ Destructors run order: Final Class MI D2 D1 Base Call.
22
+ Class parts are constructed from left to right and base class to derived class.
23
+ (b) 1 Base part and 2 Class parts.
24
+ Because ‘Base’ is a virtual base class of ‘D1’ and ‘D2’. There is only 1 Base part.
25
+ However, ‘Class’ is a normal base class of ‘Final’ and ‘Base’. So there is 2 Class part.
26
+ (c) error. Can't convert a pointer of base class to a pointer of derived class implicitly.
27
+ error. ‘Class’ is an ambiguous base of ‘Final’.
28
+ error. Can't convert a pointer of base class to a pointer of derived class implicitly.
29
+ pass. A pointer of derived class can be cast to a pointer of base class.
30
+
31
+ */
32
+ #include < iostream>
33
+
34
+ using namespace std ;
35
+
36
+ class Class {
37
+ public:
38
+ Class () { cout << " Class() called" << endl; }
39
+ ~Class () { cout << " ~Class() called" << endl; }
40
+ };
41
+
42
+ class Base : public Class {
43
+ public:
44
+ Base () { cout << " Base() called" << endl; }
45
+ ~Base () { cout << " ~Base() called" << endl; }
46
+ };
47
+
48
+ class D1 : virtual public Base {
49
+ public:
50
+ D1 () { cout << " D1() called" << endl; }
51
+ ~D1 () { cout << " ~D1() called" << endl; }
52
+ };
53
+
54
+ class D2 : virtual public Base {
55
+ public:
56
+ D2 () { cout << " D2() called" << endl; }
57
+ ~D2 () { cout << " ~D2() called" << endl; }
58
+ };
59
+
60
+ class MI : public D1 , public D2 {
61
+ public:
62
+ MI () { cout << " MI() called" << endl; }
63
+ ~MI () { cout << " ~MI() called" << endl; }
64
+ };
65
+
66
+ class Final : public MI , public Class {
67
+ public:
68
+ Final () { cout << " Final() called" << endl; }
69
+ ~Final () { cout << " ~Final() called" << endl; }
70
+ };
71
+
72
+ int main (int argc, char const *argv[])
73
+ {
74
+ Final final ;
75
+ Base *pb;
76
+ Class *pc;
77
+ MI *pmi;
78
+ D2 *pd2;
79
+ // pb = new Class;
80
+ // pc = new Final;
81
+ // pmi = pb;
82
+ pd2 = pmi;
83
+ return 0 ;
84
+ }
0 commit comments