C++ 的继承与多态 详解1

本文详细讲解了C++中的继承和多态特性,包括类的继承与派生、访问控制、类型兼容性规则以及派生类的构造函数与析构函数。重点探讨了不同继承方式下基类成员的访问属性,以及如何通过作用域分辨符和虚基类解决同名成员的标识和访问问题。多态性的实现依赖于虚函数,允许基类和派生类对象在适当场景下互换使用。
摘要由CSDN通过智能技术生成

1 继承与派生

1.1 类的继承与派生

C++ 支持多继承,一个派生类可以同时拥有多个基类,派生类的一般定义语法为:

class 派生类名:继承方式 基类名1,继承方式 基类名2... ,继承方式 基类名n {
   
	派生类成员声明;
}

Example:
class Derived :pubic Base1 , private Base2 {
   
	public:
		Derived();
		~Derived();
}

继承方式规定了派生类如何访问从基类继承下来的成员(数据成员和函数成员)。三种继承方式:public,protected,private,如果不显示给出继承方式,则默认为private继承方式。

派生类的生成过程:

  • 吸收基类成员(重用),改造基类成员(扩展),添加新的成员(扩展);
  • 吸收基类成员: 第一步将基类的成员全部接收,派生类实际上就包含了它的全部基类中除构造函数,拷贝构造函数和析构函数之外的所有成员
  • 改造基类成员:主要体现在两个方面,一是对 基类成员的访问控制,主要通过派生类定义时的继承方式来控制;而是对基类中数据成员或函数成员的覆盖和隐藏

覆盖与隐藏:

  • 覆盖: 如果派生类声明了一个和某基类成员同名的新成员(如果是函数成员,则参数表也要完全相同),则派生类的新成员将会隐藏外层的基类同名成员。这时,在派生类中或者通过派生类的对象直接使用成员函数名就只能访问到派生类中声明的同名成员,这称为同名隐藏。
  • 覆盖: 详见后面虚函数相关内容

静态成员的继承:

#include <iostream>
using namespace std;

class Base{
   
    public:
    static int a;
    static void print(){
   
        cout<<a<<endl;
    }
    static void set(int num){
   
        a=num;
    }
};

class Derive1:public Base{
   

};

class Derive2:public Base{
   

};

int Base::a=100;

int main(){
   
    Base::print(); //输出100
    Derive1::print(); //输出100
    Derive2::print(); //输出100

    //在Base中将a改为99
    Base::set(99);
    Derive1::print();  //输出99
    Derive2::print();  //输出99
    return 0;
}

从上述结果可以看出, 对于静态数据成员的继承,派生类和基类共享存储于静态区的static成员,如基类改变了static成员的值,则派生类中继承下来的static成员也将随之改变。

1.2 访问控制

派生继承了基类的全部数据成员和除了构造函数,拷贝构造函数,析构函数之外的全部函数成员,但是这些基类成员的访问属性在派生过程中是可以继承方式改变的,也即派生类中基类成员的访问属性由派生时的继承方式控制。

在基类中,基类的自身成员可以对基类中的任何其他成员进行访问,但是通过基类的对象只能访问该类的public成员。

在类的派生过程中,不同的继承方式将导致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值