C++中的继承与多态知识梳理

本文详细介绍了C++中的继承概念,包括公有、保护和私有继承,以及继承中的赋值兼容性和隐藏现象。此外,文章还讨论了菱形继承的问题及其解决方案——虚继承。在多态部分,讲解了虚函数的使用、多态的实现条件以及纯虚函数在抽象类中的作用。
摘要由CSDN通过智能技术生成

继承

在面向对象编程语言中,都有三大特性:封装,继承和多态。
今天我们就来研究一下,C++中的继承。

概念

继承是在面向对象的编程中,把一些相同或者相近的属性给抽象出来,以此达到代码的复用功能,大大的提高了程序的开发效率。具体的讲就是子类拥有了父类的所有成员。

通俗的讲就是在写程序时,有时候需要定义一个人类,好不容易写完,写全一个人的类,现在又要写一个学生类,那么没有继承就需要把人类有的属性在学生类中写一遍,再加上学生类特有的属性。想一想,我们为什么不把人这个类复用起来呢?人类中的属性学生类中也都有,所以我们可以用学生类来继承人类,那么人类就是学生类的父类也可以叫基类,子类就是学生类也叫派生类。
代码举例:

// 父类
class Person
{
    public:
    void fun()
    {
        cout << name <<endl;
    }
    protected:
    string name;
};
// 子类
class Student : public Person // 继承关系
{
    private:
    string num;
};
  • 继承方式
    重点来了。
    继承中分为三种继承方式公有继承(public)、保护继承(protected)、私有继承(private)。

继承之间有什么区别呢?
公有继承:是访问权限在父类中是什么权限在子类中也是什么权限,是继承过来了父类的成员变量和成员函数,而没有改变权限。(权限稍后解释)

保护继承:保护继承就是在父类中的比保护权限大的成员变量和成员函数都变成保护权限。而比保护权限小的不变。怎么理解呢?
父类中public修饰的成员保护继承后也将变成保护权限,而父类中保护成员到子类中则还是protected,私有成员被继承后,在子类中是不可见成员,但在子类中确实存在。

私有继承:私有继承就是把父类的成员继承过来后,父类成员变成了私有属性,只能被类的内部访问,不能被外部访问。父类中私有成员变为不可见。

我么来总体总结为一副图:
继承关系图

访问限定符(权限是我自己起的,便于理解!哈哈!)
访问限定符有三种:公有,保护,私有。你没有看错,和继承方式中 三个一样。
在这里就说说各自的功能,公有限定符,可以被类外的对像直接访问,保护限定符,可以被继承的类进行访问,但是不能被类外访问。私有限定符,只能在类的内部进行访问,被继承后变为不见。

赋值兼容性规则

在公有继承中会出现把子类对象赋值给父类,这样的做法是完全可以的。我们可以称为切割。
1)不能把父类对象赋值给子类对象。
2)能把子类对象赋值给父类对象。(因为在赋值时候会形成临时变量,而临时变量具有常性,所以会切割一份和父类一样的,赋值给父类)
我们用一张图理解。
赋值关系
在上图中,父类就是成员函数和成员变量一定包含在子类中,而子类中的成员函数和成员变量不一定全都在父类中,所以就子类可以赋值给父类,而父类不能赋值给子类。
还有两点:
1)父类的指针或者引用可以指向子类
2)而子类的指针或者引用不能指向父类(非要指向可以强转,但后果可能崩掉)

隐藏

隐藏是在继承中,子类和父类有相同的名称,当子类继承父类后,父类中与子类相同命名的成员变量会隐藏起来。意思就是假设父子类中都有个变量a,如果在子类访问,会直接访问到子类中的那个成员变量a,而不是父类中的a这个成员变量。
如果要在子类中访问父类的a,那么必要要加上父类的域,例如:person::a;
对于函数而言:对于成员函数来说的,如果子类和父类都有同名的函数,那么在继承过程中,子类会对父类函数进行隐藏,如果要访问父类中同名函数就要加上域名。
在这中可以定义同名变量或者同名函数是因为每个类都有自己独立的作用域。
这里要注意:重载是在同一作用域而言,而重定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值