简单继承
三句话描述继承:代码复用(子类可以完全当做父类使用)、面向对象(属性和方法描述)、长江后浪推前浪(子类不仅可以使用父类的所有属性和行为,还可以自定义自身特有的属性和行为 )。
类与类之间存在什么联系吗?当然有的,组合和继承。组合就是一个类的成员变量包含其他的类对象。我们今天讲的主要是继承。
什么叫做继承呢?从字面上看就是全部获取的意思。面向对象中的继承指的是类之间的父子关系,父类也叫做基类,子类也叫做派生类。子类拥有父类的所有属性和行为,所以子类对象可以当做父类对象来使用,所以创建子类时除了会调用自身构造函数以外还会调用父类的构造函数,顺序是先父类后子类,所以它是一个特殊的父类,并且子类中还可以添加父类中没有的属性和行为,属性就是成员变量,行为就是成员函数。那么我们该如何使用呢?
class Parent
{
public:
Parent()
{
cout << "Parent()" << endl;
}
};
class Child : public Parent
{
public:
Child()
{
cout << "Child()" << endl;
}
};
int main()
{
Child c;
Parent p;
p = c;
return 0;
}
输出结果是:
Parent()
Child()
Parent()
通过程序我们可以知道继承关系是通过 ' :'操作符形成的,继承级别是公有继承,也正如我们所说,先调用父类构造函数再子类构造函数,并且子类对象可以初始化父类对象,子类对象可以赋值给父类对象。
为什么有继承?因为继承是C++中一种重要的代码复用手段,通过继承,可以获得父类的所有功能并且可以在子类中重写已有功能或者添加新功能。
访问级别
前面说到子类可以作为父类来使用,那么子类是否可以访问父类中的私有成员变量呢?
根据面向对象理论可以得出子类拥有父类的一切属性和行为,所以子类能够直接访问父类的私有成员。
根据C++语法可以得出在类的外部不能直接访问类的私有成员,所以子类不能直接访问父类的私有成员。
那么真正答案是什么呢?
class Parent
{
private:
int mv;
public:
Parent()
{
mv = 100;
}
};
class Child : public Parent
{
public:
int addValue(int v)
{
mv = mv + v; // 如何访问父类的非公有成员??
}
};
在子类中试图修改父类的私有成员变量,结果编译报错,说父类中的mv成员变量是private的,外界无法访问。那么我们该如何访问父类中的非公有成员?
之前我们只学到public和private两种访问级别,实际上C++中还有第三种访问级别:protected。它有何意义,就是不能被外界访问,但是能被子类访问,介于public和private之间。
当前面的父类成员设置成protected时编译就能正常通过了,说明子类可以访问父类中的保护成员,但是外界却不能访问。
为什么需要protected访问级别?
首先protected成员不能被外界访问,它使得子类成员可以访问父类的成员,所以它专门是为继承关系而设计的,没有protected就无法完成真正意义上的代码复用。