目录
- 一、访问控制 (可见性控制)
- 1.private、public、protected关键字
- 2.关键字示例
- 1、关键字对类数据成员访问的限制
- 3. 公有继承
- 4. 私有继承
- 5. 保护继承
- 6. 私有继承和保护继承的区别
- 二、抽象类与纯虚函数
- 1.什么是抽象类
- 2.抽象函数/纯虚函数
- 3.抽象类示例
一、访问控制 (可见性控制)
1.private、public、protected关键字
1、the private and public keywords:
1、说明数据及函数是否可以从类外面访问
2、私有成员只能在类内的函数访问
3、公有成员可被任何其他类访问
2、the **protected ** keywords:
护属性的数据或函数可被派生类成员访问
2.关键字示例
1、关键字对类数据成员访问的限制
#include <iostream>
using namespace std;
class A {
public: // 访问属性int i;
protected:int j;
private:int k;
};
class B: public A { // 此public为派生方式
public: // 访问属性void display() {cout << i << endl; // OK, can access icout << j << endl; // OK, can access jcout << k << endl; // Error! cannot access k}
};
int main() {A a;cout << a.i << endl; // OK, can access a.icout << a.j << endl; // Error, cannot access a.jcout << a.k << endl; // Error, cannot access a.k
}
3. 公有继承
公有继承的派生类定义形式:
class Derived:public Base{ 派生类新成员定义; };
(1) 基类成员 在派生类中的访问属性不变。
(2) 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;
(3) 派生类以外的其它函数 可以通过派生类的对象,访问从基类继承的公有成员, 但不能访问从基类继承的保护成员和私有成员。
4. 私有继承
私有继承的派生类定义形式:
class Derived:private Base{ 派生类新成员定义; };
(1) 基类成员 在派生类中都变成== private==。
(2) 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;
(3) 派生类以外的其它函数 不能通过派生类的对象,访问从基类继承的任何成员。
5. 保护继承
保护继承的派生类定义形式:
class Derived:protected Base{ 派生类新成员定义; };
(1) 基类成员 公有成员和保护成员变成protected,私有成员不变。
(2) 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;
(3) 派生类以外的其它函数 不能通过派生类的对象,访问从基类继承的任何成员。
6. 私有继承和保护继承的区别
二、抽象类与纯虚函数
1.什么是抽象类
类太抽象以至于无法实例化就叫做抽象类。
2.抽象函数/纯虚函数
从继承链上来看:
1、派生类时,新类会越来越明确和具体
2、沿着派生类向父类移动,类会越来越一般化和抽象
3、如果我们沿着继承链一直往上找,遇到了一个类,这个类十分抽象以至于无法实例化,那么我们称这个类为抽象类。
成员函数应出现在哪个继承层次?
假设有个Shape类,它有两个派生类:rectangle、circle
rectangle、circle都可以求面积,都有一个getArea()函数。
对于getArea()函数的放置,我们有两个选择:
1、放哪儿都行,既可以放在基类Shape也可以放在子类中定义
2、Shape类定义中getArea()函数,并且强制要求Shape的子类必须实现getArea()
对于第二种方法,怎么实现强制要求呢?C++给出了抽象函数的概念:
抽象函数(abstract function) 也被称为纯虚函数(pure virtual function)
抽象函数要求子类实现它:
virtual double getArea() =0 ; //在Shape类中,注意这里不是大括号,而是替换为=0,纯虚函数的“纯”就体现于此
Circle子类必须实现getArea()纯虚函数才能实例化。
子类从基类将纯虚函数继承过来,如果不进行重新实现这个函数,那么此时的子类也将是一个抽象类,不能实例化。
并且要在函数后面加上override,表明是对抽象函数的覆写。
注意:纯虚函数不需要定义函数体也不能定义函数体