C++类的继承与多态

目录

1 类的继承

1.1 单继承

1.2 多继承

2 继承权限

3 虚继承

4 抽象类

5 多态

7 虚析构函数


1 类的继承

一个新的类拥有(共享)其它一个或多个已经存在的类的属性和方法,称为“类的继承”,例如:父亲和母亲是儿子的父类
    新的类,称为“子类”或“派生类”
    一个或多个已经存在的类,称为“父类”或“基类”
    如果是拥有一个类的属性和方法,称为“单继承”
    如果拥有多个类的属性和方法,称为“多继承”

1.1 单继承

格式:

class  新的类(子类或派生类)  :  继承权限    已经存在的类(父类或基类)
    {

    };
例如:
    class  Son  :    public   Father   //Son类继承自Father类,Son就拥有Father的属性和方法
    {
        //拥有自己特有的属性和方法
    };

1.2 多继承

格式:
    class   新的类(子类或派生类) :继承权限1  已经存在的类1(父类1或基类1),继承权限2  已经存在的类2(父类2或基类2),.........
    {

    };
例如:
    class  Son :  public   Father1,protected  Father2
    {

    }
注意:
    多继承(菱形继承)会出现二义性问题?解决:虚继承

2 继承权限

C++提供了三种继承权限,分别是:public(共有)、protected(受保护)、private(私有)三种
(1)public继承
    1)父类的public下的成员是被继承到子类的public修饰符下
    2)父类的protected下的成员是被继承到子类的protected修饰符下
    3)父类的private下的成员是没有被继承到子类中    
(2)protected继承
    1)父类的public下的成员是被继承到子类的protected修饰符下
    2)父类的protected下的成员是被继承到子类的protected修饰符下
    3)父类的private下的成员是没有被继承到子类中    
(3)private继承
    1)父类的public下的成员是被继承到子类的private修饰符下
    2)父类的protected下的成员是被继承到子类的private修饰符下
    3)父类的private下的成员是没有被继承到子类中

问题:
    1)子类与父类有相同的属性或方法,那么继承之后?
        如果子类与父类有相同的属性和方法,继承之后,子类会自动屏蔽父类与子类相同的属性和方法

    2)父类的构造函数和析构函数有没有被继承到子类中?
        父类的构造函数和析构函数是没有被继承到子类中
    3)父类的构造函数和析构函数与子类的构造函数和析构函数的调用时机?
        单继承:
            先调用父类的构造,再调用子类的构造;先调用子类的析构,再调用父类的析构;
        多继承:
            先调用先继承的父类的构造,后调用后继承的父类的构造,再调用子类的构造;先调用子类的析构,再调用后继成的父类的析构,再调用先继承的父类的析构
    4)子类中有其他类的对象,现在的类的的调用时机?
        先调用父类的构造,再调用的其它类的构造,最后调用子类的构造;先调用子类的析构,再调用其他类的析构,最后调用父类的析构;
    5)如果父类构造函数携带参数,子类如何实例化对象?
        子类采用构造函数初始化列表的形式解决

3 虚继承

使用vritual关键字结合继承权限去继承父类,称之为“虚继承”
格式:
    class  子类  : virtual   继承权限   父类   //虚继承
    {

    }
    或
    class  子类  :  继承权限  virtual   父类   //虚继承
    {

    }    

4 抽象类

现实世界中有些事物是不能被实例化具体的对象,就可以用抽象类来描述
    抽象类只是描述具备哪些方法,具体实现要在子类中
虚函数:
    成员函数返回值前用关键字virtual来进行声明,表示该函数是一个虚函数
    例如:
        vritual   void  function() //虚函数
        {

        }
纯虚函数:
    令虚函数等于0,就表示该函数是纯虚函数
    格式:
        virtual  函数返回值   函数名(参数列表)=0;//纯虚函数
    例如:
        virtual  void function()=0;  //表示function函数是纯虚函数
抽象类定义:
    继承关系的类中,如果父类中如果含有纯虚函数,表示该类是一个抽象类,抽象类只是用于描述该类具备哪些行为,但是不具体实现这些行为
    例如:
        动物类------人、狗、蛇等等
        (抽象类)
            动物类:
                跑---行为
            子类-人:
                跑---两只脚跑
            子类-狗:
                跑---四只脚跑
            子类-蛇:
                跑---蠕动跑
            ......
例如:

class Animal
{
public:
	virtual void run() = 0;

};
class People :public Animal
{
public:
	virtual void run()
	{
		cout << "用两只脚跑" << endl;
	}
};
class Dog :public Animal
{
public:
	virtual void run()
	{
		cout << "用四只脚跑" << endl;
	}
};	

5 多态

多种形态或多种实现方法,C++中的多态是指一种接口(指的是父类接口),多种实现方法(指的是每个子类所实现的方法),即通过父类接口实现调用子类的多种方法
构成多态性的条件:
    1)具有继承关系的两个类
    2)父类指针或引用指向子类
    3)多种实现方法需要声明为虚函数

虚函数:
    成员函数返回值前用关键字virtual来进行声明,表示该函数是一个虚函数
    例如:
        vritual   void  function() //虚函数
        {

        }
虚函数表(虚表):
    用于存放类中的虚函数,每一个类都有自己独立的虚表(前提是有虚函数),并且每一个类的对象对于该类的虚表都是共享的
    有虚表指针指向虚表:vptr
    虚函数表是在编译时就建立

(1)静态绑定(静态联编)
    是指函数或表达式的地址,在编译时就已经确定
    根据对象的类型确定成员的调用地址
    例子:
        函数重载
        模板
(2)动态绑定(动态联编)
    是指函数或表达式的地址,在运行时才确定
    例子:
        多态
    根据指向的地址的对象的类型来确定成员的调用地址

7 虚析构函数

为什么要提出虚析构函数?解决资源(子类)得不到释放的问题
    面试题:
        如果父类的析构函数不是虚函数,会带来(引起)什么问题?
        带来的问题:资源(子类)得不到释放的问题
        解决:将父类的析构函数声明为虚析构函数
虚析构函数:
    析构函数用vritual关键字来进行修饰,表示析构函数是虚析构函数
    前提:
        父类的指针或引用指向子类时
格式:
    virtual   ~类名()
    {
    }
例如:
    virtual  ~People()//虚析构函数
    {

    }    

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中,继承多态是面向对象编程的重要概念,它们增强了代码的复用性和灵活性。 1. **继承**:继承允许创建新(子)基于现有(父)或基。子会自动获得父的所有属性(数据成员)和方法(成员函数),并且可以通过重写或添加自己的特有内容来扩展功能。继承使用`class DerivedClass : AccessSpecifier BaseClass`的形式,其中`AccessSpecifier`可以是public、private或protected。 2. **多态**:多态是指同一种行为在不同的上下文中表现出不同的形态。主要体现在两个方面: - **静态多态(编译时多态)**:函数重载,通过函数名和参数列表的不同来决定调用哪个函数。 - **动态多态(运行时多态)**:虚函数的使用,子的对象可以被父型的指针或引用调用,调用的是子中的相应函数版本。 实现动态多态的关键是: - **虚函数**:在基中声明为`virtual`的成员函数,当通过基指针或引用调用时,将根据实际对象型调用对应的函数。 - **纯虚函数**:没有具体实现的虚函数,表示是一个接口,要求子必须实现,常用`= 0`定义。 - **虚析构函数**:与虚函数似,当一个基对象被删除时,会执行其对应的虚析构函数,确保资源清理的正确性。 相关问题: 1. 如何在C++中声明一个虚函数? 2. 纯虚函数的作用是什么? 3. 何时需要使用虚析构函数?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

语文同步练习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值