C++中的继承(不包含虚函数)

本文详细探讨了C++中的继承机制,包括继承权限(public、protected、private)及其作用,派生类的构造函数和析构函数的调用顺序,以及继承体系下派生类的对象模型。通过实例解析了单继承、多继承和菱形继承,并讨论了解决菱形继承二义性问题的方法。
摘要由CSDN通过智能技术生成

什么是继承?
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的类,称为派生类。
怎样实现继承?
这里写图片描述

继承权限

继承权限分为public、protected、private三种权限。
这里写图片描述
protected权限专为继承而生,如果你希望你定义的类中的成员可以被它的派生类访问,同时不能在类外被直接访问,就定义为protected。
●public继承时一个接口继承,保持is-a原则,每个父类的成员子类也可以用,因为每个子类对象也都是一个父类对象。
protected/private继承是一个实现继承,基类的成员并不会完全成为派生类的接口,非特殊情况下不使用这两种继承关系。
●使用关键字class时默认的继承权限是private,使用关键字struct时默认的继承权限是public
●不管是哪种继承方式,基类的私有成员(private)在子类中都不可以访问


派生类的默认成员函数

●派生类与普通类相同,也有六个默认的成员函数。如果在派生类里面没有显式定义这六个成员函数,编译器会自动合成这六个默认的成员函数。

构造函数

创建派生类的对象时,程序会去调用派生类的构造函数,在派生类构造函数的内部又会去调用基类的构造函数。
问题:创建对象时,程序会在派生类构造函数内部的哪个位置去调用基类的构造函数?
证明:编写一个简单的程序来验证这个问题:

#include<iostream>
using namespace std;
class Base//定义一个基类
{
public:
    Base()//显式定义出基类的构造函数
    {
        cout << "Base::Base()" << endl;//在构造函数内部打印出函数名
    }
    int _b;//基类中定义一个公有的变量
};
class Derive :public Base//定义一个派生类,让它公有继承自基类
{
public:
    Derive()//显示定义出派生类的构造函数,在该行下一个断点
    {
        cout << "Derive::Derive()" << endl;//派生类的构造函数内部让它打印出自己的函数名
    }
    int _d;//定义一个派生类自己的数据成员
};
int main()
{
    Derive d;
    return 0;
}

进行调试:在让函数在断点处停下,
这里写图片描述
紧接着让函数仅执行一步(vs2013环境下按下fn+f11):
这里写图片描述
我们可惜清晰的看到函数直接跳转到了基类的构造函数的位置。
程序运行结果:
这里写图片描述
结论:在构造派生类对象时,会调用派生类的构造函数,在派生类的构造函数内部,会首先去调用基类的构造函数,之后再去执行派生类构造函数的语句。

析构函数

析构派生类对象时,程序会先执行派生类自身的析构语句,在派生类析构函数的内部调用基类的析构语句。
问题:程序析构派生类对象时,会在派生类对象析构函数内部的哪个位置调用基类的析构函数?
证明:写一段简单的代码来证明这个问题:

#include<iostream>
using namespace std;
class Base//定义一个基类
{
public:
    ~Base()//显式定义出基类的析构函数
    {
      
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值