C++中的继承特性(1)

1.何为继承
首先,继承是什么?继承可以简单理解为孩子继承了父母双亲的基因,在拥有父母某些特性的同时,又有自己独立的特性。
在C++中,继承是类与类之间的继承,即某个类可以继承它类的成员变量、成员函数,同时又可以拥有自己独有的成员变量、成员函数。
继承定义格式如下:

class <派生类类名>: <继承方式> <基类类名>
{};

派生类即新生成的类,相当于孩子,又称子类;基类即原有的类,相当于父亲,又称父类。
其中继承方式有如下三种:
public(公有继承):将保留基类成员的原有访问权限。即基类中的public成员仍为public,protected成员仍为protected,private仍为private且派生类无权访问。
protected(保护继承):将保护基类的所有成员。基类中的私有成员(private)仍无权访问,但public和protected成员将均作为保护成员继承。
private(私有继承):将以私有方式继承基类的所有成员。即无论成员变量原有访问权限是什么,在派生类中均为私有属性,但基类的私有成员派生类仍无权访问。


2.友元与继承
在类中,友元函数时可以访问类中的私有成员的,那么它是否可以访问派生类中的私有成员呢?
在下图程序代码中,test函数访问了派生类B的私有成员_b:
友元与继承
由图可以看到,基类A中的友元函数test无法访问派生类B中的私有成员,即友元关系是不会被继承的,因为友元函数并不属于基类自身的函数。


3.构造、析构的继承
在继承中,构造与析构并不会拷贝到派生类中,而是在派生类构造函数的初始化列表中会自动调用基类的构造函数,示例程序如下:

class Parent{
public:
    Parent(){
        cout << "Parent()" << endl;
    }
    ~Parent(){
        cout << "~Parent()" << endl;
    }
private:
    int _p;
};

class Child:public Parent
{
public:
    Child(){
        cout << "Child()" << endl;
    }
    ~Child(){
        cout << "~Child()" << endl;
    }
private:
    int _c;
};

void FunTest(){
    Parent p;
    Child c;
}
int main(){
    FunTest();
    system("pause");
    return 0;
}

程序最终运行结果如下:
构造与析构

(1)构造函数的执行过程
a)其中第一个Parent()是构造对象p时输出的,汇编指令如下图:
构造汇编1
b)而后在构造对象c时,首先进入c的构造函数,如下图:
构造汇编2
c)在下图中可以看到,在执行构造函数体(即输出”Child()”字符串)之前,程序会调用一次Parent构造函数,故派生类会在构造函数的初始化列表中调用基类的构造函数。
构造汇编3
总结:派生类构造函数执行如下:
构造函数流程
(2)析构函数的执行过程
在一个函数执行完毕后,需将其中的局部变量释放,若局部变量是某类的对象,则释放前会调用类的析构函数。
a)对于FunTest函数,先定义了p对象,再定义了c对象,则会先释放c,再释放p,汇编指令如下:
析构汇编1
b)而后进入派生类Child的析构函数:
析构汇编2
c)执行了函数体之后:
析构汇编3
d)在Child析构函数执行完毕后可看到如下一条call指令,故而在析构c对象时,会先打印~child(),再打印~Parent():
析构汇编4
总结:派生类析构函数执行过程如下:
析构函数过程
由栈的先进后出原则,先定义的变量必定最后释放,故析构变量的顺序也是如此。


本文为博主初学继承的一些认识,如有错误或不当之处,欢迎大家批评指正!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值