C++被遗弃的多重继承

本文探讨了C++中的多重继承特性,包括其允许一个子类继承多个父类的功能,但也带来地址不一致、数据冗余等问题。为解决这些问题,介绍了虚继承的概念,如虚基类如何减少数据冗余,但可能导致架构设计复杂。同时,建议在实际编程中采用单继承结合多接口的方式,以避免某些多继承问题,并提到了`dynamic_cast`在类型转换中的应用。
摘要由CSDN通过智能技术生成

C++被遗弃的多重继承

C++中的多重继承

C++支持编写多重继承
  • 一个子类可以拥有多个父类
  • 子类拥有所有父类的成员变量
  • 子类继承所有父类的成员函数
  • 子类对象可以当作任意父类对象使用
//
class Derived : public BaseA,
                public BaseB,
                public BaseC
{
    
}

多重继承的问题

问题一

通过多继承得到的对象可能拥有“不同的地址”

问题二

多重继承可能产生冗余

处理方案:虚继承
class People{};
class Teacher : virtual public People{};
class Doctor  : public Teacher{};
产生的问题
  • 虚继承解决了数据冗余问题
  • 中间层父类不再关心顶层父类的初始化
  • 最终子类必须直接调用顶层父类的构造函数

小结

  • C++支持多重继承的编程方式
  • 多重继承的问题
    • 可能出现“用一个对象的地址不同”
    • 数据冗余
    • 虚继承使得架构设计可能出现问题

问题三

多重继承可能产生多个虚函数表

正确使用多继承

单继承 + 实现多接口

#include <iostream>
using namespace std;
class Base
{
    
public:
    int mi;
    Base(int i)
    {
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};

class Interface1
{
public:
    virtual void add(int i) = 0;
    virtual void minus(int i) = 0;
};
class Interface2
{
public:
    virtual void multiply(int i) = 0;
    virtual void divide(int i) = 0;
};

class Derived : public Base,public Interface1,public Interface2
{
public:
    Derived(int i):Base(i)
    {

    }
    void add(int i)
    {
        mi += i;
    }
    void minus(int i)
    {
        mi -= i;
    }
    void multiply(int i)
    {
        mi *= i;
    }
    void divide(int i)
    {
        if (i!=0)
        {
            mi /= i;
        }
        
    }
};
int main(int argc, char const *argv[])
{
    Derived d(100);
    
    return 0;
}

正确使用多重继承

  • 先继承一个父类,然后实现多个接口
  • 父类中提供equal()成员函数
  • equal()成员函数用于判断指针是否指向当前对象
  • 与多重继承相关的强制类型转换用dynamic_cast完成

小结

  • 多继承中可能出现多个虚函数表指针
  • 与多重继承相关的强制类型转换用dynamic_cast完成
  • 工程开发中,“单继承多接口”的方式使用多继承
  • 父类提供了成员函数用于判断指针是否向电当前对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值