什么是继承?
●继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的类,称为派生类。
怎样实现继承?
继承权限
继承权限分为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()//显式定义出基类的析构函数
{