1、继承概念
面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。我们已经讲解了类和对象,了解了面向对象程序设计的两个重要特征一数据抽象与封装,已经能够设计出基于对象的程序,这是面向对象程序设计的基础。
要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特 征——继承性和多态性。本章主要介绍有关继承的知识,多态性将在后续章节中讲解。
继承性是面向对象程序设计最重要的特征,可以说,如果没有掌握继承性,就等于没有掌握类和对象的精华,就是没有掌握面向对象程序设计的真谛。
类之间的关系
has-A,uses-A 和 is-A
has-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。
uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。
is-A 机制称为“继承”。关系具有传递性,不具有对称性。
继承的概念
派生类的定义
继承重要说明
1、子类拥有父类的所有成员变量和成员函数
4、子类可以拥有父类没有的方法和属性
2、子类就是一种特殊的父类
3、子类对象可以当作父类对象使用
实例
#include <iostream>
using namespace std;
class Parent {
public:
void print()
{
a = 0;
b = 0;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
int a;
int b;
private:
};
//class Child : protect Parent
//class Child : private Parent
class Child : public Parent
{
public:
private:
int c;
};
void main()
{
Child c1;
c1.a = 2;
c1.b = 3;
c1.print();
system("pause");
}
2、派生类的访问控制
派生类继承了基类的全部成员变量和成员方法(除了构造和析构之外的成员方法),
但是这些成员的访问属性,在派生过程中是可以调整的。
单个类的访问控制
1)C++中的继承方式会影响子类的对外访问属性
public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
2)private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员 。
3)C++中子类对外访问属性表
“三看”原则
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)
派生类类成员访问级别设置的原则
思考:如何恰当的使用public,protected和private为成员声明访问级别?
1、需要被外界访问的成员直接设置为public
2、只能在当前类中访问的成员设置为private
3、只能在当前类和子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。
综合训练
#include <cstdlib>
#include <iostream>
using namespace std;
class A
{
private:
int a;
protected:
int b;
public:
int c;
A()
{
a = 0;
b = 0;
c = 0;
}
void set(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
};
class B : public A
{
public:
void print()
{
//cout<<"a = "<<a; //err
cout << "b = " << b;//ok
cout << "c = " << endl;//ok
}
};
class C : protected A
{
public:
void print()
{
//cout<<"a = "<<a; //err
cout << "b = " << b;//ok
cout << "c = " << endl;//ok
}
};
class D : private A
{
public:
void print()
{
//cout<<"a = "<<a; //err
cout << "b = " << b << endl;//ok
cout << "c = " << c << endl;//ok
}
};
int main(int argc, char *argv[])
{
A aa;
B bb;
C cc;
D dd;
aa.c = 100; //ok
bb.c = 100; //ok
//cc.c = 100; //err
//dd.c = 100; //err
aa.set(1, 2, 3); //ok
bb.set(10, 20, 30); //ok
//cc.set(40, 50, 60); //err
//dd.set(70, 80, 90); //err
bb.print(); //ok
cc.print(); //ok
dd.print(); //ok
system("pause");
return 0;
}