设为首页 加入收藏

TOP

C++中的多重继承(一)(二)
2019-05-24 12:07:53 】 浏览:123
Tags:多重 继承
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,虚继承使得架构设计可能出现问题;

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++中的new/delete、构造/析构函.. 下一篇C++对象在继承情况下的内存布局

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目