zoukankan      html  css  js  c++  java
  • 为什么需要多重继承?它的优缺点是什么?

    解析:
    实际生活中,一些事物往往会拥有两个或两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。举个例子:
    人(Person)可以派生出作者(Author)和程序员(Programmer),然而程序员作者同时拥有作家和程序员的两个属性,即既能编程又能写作,如图9.2所示。

    Person

    Author

    Programmer

    Programmer_Author

    图9.2  各个类继承关系
    使用多重继承的例子程序如下:
    1       #include <iostream>
    2       using namespace std;
    3      
    4       class Person
    5       {
    6       public:
    7                void sleep() {cout << "sleep" << endl;}
    8                void eat() {cout << "eat" << endl;}
    9       };
    10    
    11     class Author : public Person             //Author继承自Person
    12     {
    13     public:
    14              void writeBook() {cout << "write Book" << endl;}
    15     };
    16    
    17     class Programmer : public Person       //Programmer继承自Person
    18     {
    19     public:
    20              void writeCode() {cout << "write Code" << endl;}
    21     };
    22    
    23     class Programmer_Author : public Programmer, public Author     //多重继承
    24     {
    25     };
    26    
    27     int main()
    28     {
    29              Programmer_Author pa;
    30    
    31              pa.writeBook();   //调用基类Author的方法
    32              pa.writeCode();   //调用基类Programmer的方法
    33              pa.eat();         //编译错误,eat()定义不明确
    34              pa.sleep();       //编译错误,sleep()定义不明确
    35    
    36              return 0;
    37     }
    多重继承的优点很明显,就是对象可以调用多个基类中的接口,如代码31行与代码32行对象pa分别调用Author类的writeBook()函数和Programmer类的writeCode()函数。
    多重继承的缺点是什么呢?如果派生类所继承的多个基类有相同的基类,而派生类对象需要调用这个祖先类的接口方法,就会容易出现二义性。代码33、34行就是因为这个原因而出现编译错误的。因为通过多重继承的Programmer_Author类拥有Author类和Programmer类的一份拷贝,而Author类和Programmer类都分别拥有Person类的一份拷贝,所以Programmer_Author类拥有Person类的两份拷贝,在调用Person类的接口时,编译器会不清楚需要调用哪一份拷贝,从而产生错误。对于这个问题通常有两个解决方案:
    (1)加上全局符确定调用哪一份拷贝。比如pa.Author::eat()调用属于Author的拷贝。
    (2)使用虚拟继承,使得多重继承类Programmer_Author只拥有Person类的一份拷贝。比如在11行和17行的继承语句中加入virtual就可以了。
    1       class Author : virtual public Person         //Author虚拟继承自Person
    2       class Programmer : virtual public Person    //Programmer虚拟继承自Person
    答案:
    实际生活中,一些事物往往会拥有两个或两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念。
    多重继承的优点是对象可以调用多个基类中的接口。
    多重继承的缺点是容易出现继承向上的二义性。

  • 相关阅读:
    mysql索引类型normal,unique,full text的区别
    php中模糊查询并关联三个select框
    JQuery实现获取多个input输入框的值,并存放在一个数组中
    Chrome 浏览器跨域和安全访问问题 使用 chrome的命令行标记:disable-web-security 参数联调线上数据
    sqlserver 出现 因为文件组 'PRIMARY' 已满 的解决办法 有可能是磁盘剩余空间不足 导致的
    asp.net 分析器错误消息: 文件.aspx.cs”不存在错误
    SQLSERVER排查CPU占用高的情况
    SQL Server Cpu 100% 的常见原因及优化
    Getting Started with OWIN and Katana(Console 代替iis 制作 web服务的简单方案)
    Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)
  • 原文地址:https://www.cnblogs.com/timssd/p/4268865.html
Copyright © 2011-2022 走看看