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

来源:互联网 发布:手机vr摄像软件 编辑:程序博客网 时间:2024/05/09 17:23

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 0
原创粉丝点击