ame;
9 int m_age;
10 public:
11 People(string name, int age)
12 {
13 m_name = name;
14 m_age = age;
15 }
16 void print()
17 {
18 cout << "Name = " << m_name << ", "
19 << "Age = " << m_age << endl;
20 }
21 };
22
23 class Teacher : virtual public People
24 {
25 public:
26 Teacher(string name, int age) : People(name, age)
27 {
28 }
29 };
30
31 class Student : virtual public People
32 {
33 public:
34 Student(string name, int age) : People(name, age)
35 {
36 }
37 };
38
39 class Doctor : public Teacher, public Student
40 {
41 public:
42 Doctor(string name, int age) : Teacher(name, age + 1), Student(name, age), People(name, age)
43 { // 如果在这里没有调用 People(name, age),编译器会在这一样显示如下错误:
44 // error: no matching function for call to 'People::People()'
45 // note: candidates are: People::People(std::string, int) 这是在父类构造的一行;
46 } // note: People::People(const People&) ,这个编译器提供,在类最开始那一行;
47 };
48
49 int main()
50 {
51 Doctor d("Delphi", 33);
52
53 d.print(); // 未有虚继承时,编译器显示:error: request for member 'print' is ambiguous
54 // error: candidates are: void People::print()
55 // error: void People::print()
56 /* 未有虚继承时,可以这样分作用域分辨符来继承 */
57 d.Teacher::print(); // Name = Delphi, Age = 33;
58 d.Student::print(); // Name = Delphi, Age = 33;
59
60 return 0;
61 }
8,多重继承关系出现闭合时将产生数据冗余的问题:
1,解决方案:虚继承;
2,代码示例:
1 class People {};
2 class Teacher : virtual public People {};
3 class Student : virtual public People {};
4 class Doctor : public Teacher, public Student {};
9,多重继承的问题二:
1,虚继承能够解决数据冗余问题;
2,中间层父类不再关心顶层父类的初始化;
1,规则不清晰;
2,当今的软件产品,动则几十万行代码,业务逻辑已经很复杂了,我们希望编程语言越简单越好,不希望几套标准,这样的话,只会造成生成效率的低下和致命的 bug;
3,工程中可能是很多层继承,这样找的很麻烦,可以几班解决;
3,最终子类必须直接调用顶层父类的构造函数;
10,问题:
1,当架构设计需要继承时,无法确定使用直接继承还是虚继承;
1,开发者感觉增加了开发时间;
2,架构设计时,无法知道开发者是否会多重继承;
3,都做成虚继承的时候,多重继承加虚继承太过复杂,影响效率和移植性(不同编译器可能有不同实现方式);
4,多重继承只适合学术研究,工程一般不使用;
11,小结:
1,C++ 支持多重继承的编程方式;
1,除了 C++ 支持多重继承,基本上其它语言并不支持;
2,多重继承容易带来问题:
1,可能出现“同一个对象的地址不同”的情况;
2,虚继承可以解决数据冗余的问题;
3,虚继承使得架构设计可能出现问题;
|