c++中的继承和多态

本文介绍了C++中的继承和多态概念。继承包括公有、私有和保护继承,派生类具备基类的功能。多态允许通过基类指针调用派生类重写的虚函数,实现动态绑定。动态多态需要基类有虚函数,通过基类指针调用,确保不同对象可以按同一接口操作。虚函数表和虚指针是多态的实现机制。
摘要由CSDN通过智能技术生成

1.继承

面向对象程序设计的核心思想是数据抽象,继承和动态绑定(封装,继承,多态)。通过数据抽象可以将类的接口和实现分离;通过继承可以定义相似的类型;通过动态绑定可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。
继承有基类和派生类(父类和子类)。

继承关系

继承关系有三种:
在这里插入图片描述注意和访问控制符区分:
public:公有,任何位置都可以访问
private:私有成员,只有类自己的成员函数才能访问
protected: 保护成员,只有类自己和子类的成员函数才能访问

类型兼容原则:
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,**公有派生类实际就具备了基类的所有功能,**凡是基类能解决的问题,公有派生类都可以解决。
子类对象可以赋值给父类对象,父类对象不能赋值给子类对象
父类指针/引用可以指向子类对象,子类指针/引用不可以指向父类对象(可强转)

tips:
重载:范围相同,函数名相同,参数不同,virtual可有可无
覆盖:范围不同,函数名相同,参数相同,基类必须有virtual关键字
隐藏:如果派生类函数与基类同名,但参数不同,此时无论有无virtual基类都会被隐藏;如果派生类函数与基类同名,参数也相同,但基类没有virtual,此时基类函数被隐藏。
在这里插入图片描述

构造函数调用顺序:基类——派生类成员变量——派生类
析构函数调用顺序:派生类——派生类成员变量——基类
友元函数不能被继承,因为不属于类。

继承类型

https://blog.csdn.net/c_base_jin/article/details/86036185
在这里插入图片描述

1.单继承
一个派生类只有一个直接基类
class stu : public person
所占内存大小为父类+子类特有成员变量
2.多继承
一个派生类有两个或以上直接基类
class stu : public person, public gender
所占内存大小为所有父类成员变量+子类特有成员变量
多个基类中有成员同名时,可以使用作用域运算符::进行限定
3.菱形继承
!在这里插入图片描述
多重继承中特殊的形式。也存在二义性,还会造成内存浪费。
比如类C中会存在两份基类N。引用基类N中的数据还需要通过域运算符区分。
在这里插入图片描述
所以引入了虚基类,使得在间接继承共同基类时只保留一份基类成员。虚基类并不是在声明基类时声明的,而是在声明派生类时指定继承方式声明的。在最后的派生类中不仅要对直接基类进行初始化,还要负责对虚基类初始化。
C++编译系统只执行最后的派生类对基类的构造函数调用,而忽略其他派生类对虚基类的构造函数调用。从而避免对基类数据成员重复初始化。因此,虚基类只会构造一次。
在这里插入图片描述

//公共基类
class N
{
   
public:
    N(int data1, int data2, int data3) :
        m_data1(data1),
        m_data2(data2),
        m_data3(data3)
    {
   
        std::cout << "call common constructor" << std::endl;
    }
    virtual ~N(){
   }

    void    display()
    {
   
        std::cout << m_data1 << std::endl
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值