在 C++中可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。

总结:

1、只要是父类中的private成员,不管是什么继承方式,儿子都访问不了,但它是存在在儿子之中
2、如果是公有(public)继承, 儿子中的访问控制权限保持不变。
3、如果是保护(protected)继承, 儿子中父亲中除了private成员,其余在儿子中都是protected
4、如果是私有(private)继承, 儿子中的父亲的除了private成员,其余在二中都是private成员。
5、查看能否调用的//三看原则:  
                    (1) 看调用的成员变量是在类的内部还是类的外部
                    (2) 看儿子继承方式,
                    (3) 当前变量在儿子中的变量在父亲中的访问控制权限
6、构造方法和析构方法不继承

5.1 类和类之间的关系

has-A,uses-A 和 is-A

has-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。

uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。

is-A 机制称为“继承”。关系具有传递性,不具有对称性。

5.2继承

类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类 的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。

派生类的组成:

派生类中的成员,包含两大部分,一类是从基类继承过来的,一类是自己增加的成员。从基类继承过过来的表现其共性,而新增的成员体现了其个性。

几点说明:

1,全盘接收,除了构造器与析构器。基类有可能会造成派生类的成员冗余,所以说基类是需设计的。

2,派生类有了自己的个性,使派生类有了意义。

5.3、 继承的⽅式

5.3.1 语法

class 派⽣类名:[继承⽅式] 基类名 {

派⽣类成员声明;

};

一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类, 称为单继承。

protected 对于外界访问属性来说,等同于私有,但可以派生类中可见

public继承:

当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。即基类的公有成员和保护成员被继承到派生类 中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。无论派生类的成员还是派生类的对象都无法访问基类的私有成员。

protected继承:

保护继承中,基类的公有成员和私有成员都以保护成员的身份出现在派生类 中,而基类的私有成员不可访问。派生类的其他成员可以直接访问从基类继承来的 公有和保护成员,但是类外部通过派生类的对象无法访问它们,无论派生类的成员 还是派生类的对象,都无法访问基类的私有成员。

private继承:

当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可访问。基类的公有 成员和保 护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接 访问它们,但 是在类外部通过派生类的对象无法访问。无论是派生类的成员还是通过派生类的对 象,都无法访问从基类继承的私有成员。通过多次私有继承后,对于基类的成员都 会成为不可访问。因此私有继承比较少用。

private成员在子类中依然存在,但是却无法访问到。不论何种方式继承基类,派生类都不能直接使用基类的私有成员 。

如何恰当使用public,protected,private继承方式:

1、需要被外界访问的成员直接设置为public

2、只能在当前类中访问的成员设置为private

3、只能在当前类和子类中访问的成员设置为protected(protected成员的访问权限介于public和private之间。 )

1类和类之间的关系

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class A
{
public:void func() {cout << "funcA" << endl;}int a;
};//类B拥有类A的成员变量, B has A ,//类B 依赖于 类A  依赖度高
class B
{
public:void funcB() {}A a;
};
//耦合度  高内聚 低耦合//类C 的成员方法  需要类A的形参, C use A,//类C 依赖于 类A
class C
{
public:void funcC(A *a) {}void funcC2(){}
};//D继承与A    类D 如果是继承类A  类 D  is  A 。//类D继承与A 耦合度很高
class D :public A
{
public:void funcD() {cout << this->a << endl;}};class E :public D
{
};
int main(void)
{return 0;
}

2继承的基本概念

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>using namespace std;class Student
{
public:Student(){}Student(int id, string name){this->id = id;this->name = name;}void printS() {cout << "id = " << this->id << ", name = " << this->name << endl;}int id;
private:string name;
};//创建一个新的学生类,增加score、功能
class Student2
{
public:Student2(int id, string name, int score){this->id = id;this->name = name;this->score = score;}void printS() {cout << "id = " << this->id << ", name = " << this->name << endl;cout << "score = " << this->score << endl;}
private:int id;string name;//addint score;
};//通过继承创建一个新的学生类
class Student3 :public Student
{
public://Student3(int id, string name, int score) //{// this->id = id;//    this->name = name;  //无法访问父类的私有成员// this->score = score;//}Student3(int id, string name, int score) :Student(id, name)  //利用父类的构造方法进行初始化部分数据成员{this->score = score;}void printS() {Student::printS();cout << "score = " << this->score << endl;}
private:int score;
};int main(void)
{Student3 s3(1, "zhang3", 80);s3.printS();return 0;
}
#endif

3继承的方式

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory>using namespace std;//规则1,  只要是父类中的private成员,不管是什么继承方式,儿子都访问不了
//规则2,  如果是公有(public)继承, 儿子中的访问控制权限保持不变。
//规则3,  如果是保护(protected)继承, 儿子中父亲中除了private成员,其余在儿子中都是protected
//规则4,  如果是私有(private)继承, 儿子中的父亲的除了private成员,其余在二中都是private成员。class Parent
{
public:int pub; //在类的内部 和 外部 都能访问。
protected:int pro; //在类的内部可以访问, 在类的外部不可以访问
private:int pri;  //在类的内部可以访问, 在类的外部不可以访问
};//公有继承
class Child :public Parent
{
public:void func(){cout << pub << endl; //pub父类的public成员变量,在public继承 类的 【内部 外部】可以访问。
cout << pro << endl;//pro 是父类protected成员变量 在public继承类的 【内部】可以访问。外部访问不了 //此时的pro在孙子能够访问,说此时pro不是private成员,而是protected成员//cout << pri << endl; //pri 是父类private成员变量 在public继承类的 【内部,外部】[不]可以访问。}};//孙子类
class SubChild : public Child
{void sub_func(){cout << pro << endl;}
};//保护继承
class Child2 :protected Parent
{
public:void func2() {pub;//此时pub通过protected继承 能够在类的内部访问。 //pub 在类的内部可以访问, 类的外部访问不了, 类的儿子可以访问//pub 就是protected成员pro;//pro 根pub 是一样的性质,pro也是protected成员//pri;}
};class Sub_child2 :public Child2
{
public:void sub_func2() {pub;pro;}
};//私有继承
class Child3 :private Parent
{
public:void func3(){pub;//pub 在类的内部可以访问。在类的内部可以访问,类的外部不能访问。//pub 在儿子中访问不了,说明pub在Child3中是 私有成员pro;//pro 根pub的性质是一样, 也是私有成员。//pri;}
};class Sub_Child3 :public Child3
{
public:void sub_fun3(){//pub;//pro;}
};//三看原则:
//1 看调用的成员变量是在类的内部还是类的外部
//2 看儿子继承方式,
//3 当前变量在儿子中的变量在父亲中的访问控制权限int main(void)
{Child c1;c1.func();c1.pub;//c1.pri;Child2 c2;//c2.pub;//c2.pro;Child3 c3;//c3.pub;//c3.pro;c1.pub;return 0;
}
#endif

4继承方式的练习

#if 0
#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;      //a是父类的私有成员访问不了cout << "b    =  " << b;      //b 此时是保护成员,类的内部可以访问cout << "c    =  " << c << endl;    //c 此时是公有成员,类的内部可以访问}
};class C : protected   A
{
public:void print(){//cout << "a =  " << a;      //a是父类的私有成员访问不了cout << "b    =  " << b;      //b 在子类中是protected权限,类的内部可以访问。cout << "c  =  " << c << endl;     //c 子类的protected成员,类的内部可以访问。}
};class D : private A
{
public:void print(){//cout << "a =  " << a;      //a是父类的私有成员访问不了cout << "b    =  " << b << endl;    //b 此时是private成员,类的内部可以访问。cout << "c  =  " << c << endl;    //c 此时是private成员,类的内部可以访问。}
};int   main(void)
{A  aa;B    bb;C    cc;D    dd;aa.c = 100;          //c 是公有 ,类的外部可以访问。bb.c = 100;           //Bpublic 继承与A ,保持权限不变,c 是公有, 类的外部可以访问//cc.c = 100;
//C protected 继承与A, c 在此类中是protected成员,类的外部不能访问。
//dd.c = 100;  //D private 继承与A, c在此类中private成员,类的外部不能访问。aa.set(1, 2, 3);        //set在父类中是公有权限,类外能访问bb.set(10, 20, 30);      //set是public继承,在子类中是public权限,在类外能访问//cc.set(40, 50, 60);  //set是protected继承,set在子类中是保护权限 类外不能否访问//dd.set(70, 80, 90);  //set是private继承,set在子类中是私有权限 类外不能否访问bb.print();   //print 是定义在B类 public成员函数,在类的外部可以访问。cc.print(); //print 是定义在C类 public成员函数,在类的外部可以访问。dd.print();  //print 是定义在D类 public成员函数,在类的外部可以访问。return 0;
}
#endif

C++基础13-类和对象之继承1相关推荐

  1. 命名空间_python基础 13 类命名空间于对象、实例的命名空间,组合方法

    python基础 13 类命名空间于对象.实例的命名空间,组合方法 1.类命名空间于对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两 ...

  2. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  3. Racket编程指南——13 类和对象

    13 类和对象 本章基于一篇论文[Flatt06]. 一个类(class)表达式表示一类值,就像一个lambda表达式一样: (class superclass-expr decl-or-expr . ...

  4. c++入门(类和对象and继承)

    文件名:<1> time.h :<2> time.cpp :<3> DateTime.h :<4> DateTime.cpp :<5> ma ...

  5. java基础(类与对象、集合)

    java基础(类与对象.集合) 类与对象 类与对象中的栈和堆 构造方法 this关键字 面向对象三大特性 封装性(private) 继承性(extends) 方法重写(@override) 多态性 向 ...

  6. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  7. JAVA基础––从类和对象开始

    JAVA基础--从类和对象开始 一.概念 1.面向对象中类和对象的概念 对象:对象是具有状态和行为的实体,例如某个具体的学生,或者是王者荣耀里的英雄,可以是物理实体,也可以是逻辑实体. 类:类是一组具 ...

  8. Java_面向对象基础(类、对象、方法和构造函数)

    Java的面向对象基础(类.对象.方法和构造函数) 面向对象的基本概念 面向对象的设计思想 什么是类 什么是对象 类的定义 设计面向对象的例子 步骤一:设计动物这个类 步骤二:创建具体的动物 步骤三: ...

  9. python入门笔记——类和对象⑤(继承)

    python入门笔记--类和对象⑤(继承) # python中展现面向对象的三大特征:封装.继承.多态 # 封装:把内容封装到某个地方以便后续的使用 # 对封装来说,其实就是使用初始化构造方法将内容封 ...

  10. 【C++基础】类和对象——友元

    [C++基础]类和对象--友元 友元的概念 在C++中,不能被外部访问的私有属性,通过友元可以访问. 友元的关键字:friend 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 一.全局函数 ...

最新文章

  1. 利用现有资源快速实现汉语专用分词系统
  2. pytorch移动端教程 Java调用libtorch
  3. jquery的ajax,请求JSON数据。
  4. helm安装postgres_添加到postgres数据库外的keycloak k8s helm chart环境参数
  5. 【BZOJ 1098】办公楼(补图连通块个数,Bfs)
  6. steam api接口 php,php – 将Steam API信息提取到页面
  7. 【面向对象】面向对象程序设计测试题14-Java文件测试题
  8. 2017.10.9 放棋子 思考记录
  9. pycharm常用的快捷方式及设置
  10. wireshark 分析mptcp ecn语句
  11. 计算机底部怎么不显示网络连接图标不见了,电脑任务栏不显示网络连接图标怎么办...
  12. 全国智慧园区解决方案TOP50 | 附下载
  13. 凹点匹配 matlab源码,基于凹点搜索的重叠粉体颗粒的自动分离算法
  14. 小米无线键盘的连接方式
  15. .NET MAUI 性能提升
  16. 减肥要吃...淡化色斑要吃....皮肤干燥要吃...长了小痘痘要吃...整天对着电脑要吃...记住这些
  17. 全球时区(查询备用)
  18. 濒死状态下的静息态网络激活和功能连接
  19. Spatial Attention
  20. 大数据时代的 3V + 3高

热门文章

  1. android imageview 设置网络图片,ImageView加载网络图片
  2. zap安装提示java_使用API调用进行ZAP身份验证
  3. mysql 开启远程访问_QxOrm 访问 MySQL
  4. asm 查看 数据文件 修改 时间_Oracle的ASM介绍及管理
  5. mysql一共有多少引擎_MySQL存储引擎你们知道多少?
  6. python寻找多数元素_寻找多数元素
  7. python中seed的用法_Python中的seed()方法怎么用
  8. scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)
  9. 在微型计算机中1 mb准确等于几个字,2010安徽省计算机等级考试二级试题及答案...
  10. oracle 修改2个表,oracle学习笔记2:创建修改表