0
点赞
收藏
分享

微信扫一扫

【C++grammar】访问控制与抽象类与纯虚函数


目录

  • ​​一、访问控制 (可见性控制)​​
  • ​​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 i
cout << j << endl; // OK, can access j
cout << k << endl; // Error! cannot access k
}
};
int main() {
A a;
cout << a.i << endl; // OK, can access a.i
cout << a.j << endl; // Error, cannot access a.j
cout << a.k << endl; // Error, cannot access a.k
}

3. 公有继承

公有继承的派生类定义形式:

​class Derived:public Base{ 派生类新成员定义; };​

(1) 基类成员 在派生类中的访问属性不变。
(2) 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;
(3) 派生类以外的其它函数 可以通过派生类的对象,访问从基类继承的公有成员, 但不能访问从基类继承的保护成员和私有成员。
【C++grammar】访问控制与抽象类与纯虚函数_纯虚函数

4. 私有继承

私有继承的派生类定义形式:
​​​class Derived:private Base{ 派生类新成员定义; };​

(1) 基类成员 在派生类中都变成== private==。
(2) 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;
(3) 派生类以外的其它函数不能通过派生类的对象,访问从基类继承的任何成员。
【C++grammar】访问控制与抽象类与纯虚函数_面向对象编程_02

5. 保护继承

保护继承的派生类定义形式:
​​​class Derived:protected Base{ 派生类新成员定义; };​

(1) 基类成员 公有成员和保护成员变成protected,私有成员不变。
(2) 派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;
(3) 派生类以外的其它函数 不能通过派生类的对象,访问从基类继承的任何成员。
【C++grammar】访问控制与抽象类与纯虚函数_抽象类_03

6. 私有继承和保护继承的区别

【C++grammar】访问控制与抽象类与纯虚函数_抽象类_04

二、抽象类与纯虚函数

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,表明是对抽象函数的覆写。
【C++grammar】访问控制与抽象类与纯虚函数_派生类_05

注意:纯虚函数不需要定义函数体也不能定义函数体

3.抽象类示例

【C++grammar】访问控制与抽象类与纯虚函数_抽象类_06


举报

相关推荐

0 条评论