Boolan 第三周笔记

首先反思一下第二周作业。我在Rectangle类中对Point类的数据成员进行赋值,而没有为Point写构造函数再通过构造函数初始化Point的成员,这样是不好的。“每个类负责定义各自的接口”,“要想与对象交互必须使用该类的接口(C++ Primer中文第五版 P532)”,这样的准则在原书中是描述基类和派生类的,我觉得同样适用于委托。因此第二周作业中Point和Rectangle应该负责定义各自的接口。

这一周老师举了很多设计模式的例子,我觉得这种方式的确可以使我理解复合,委托和继承,但是距离理解并应用这些设计模式还差得非常远。因此这篇笔记只记录继承相关的内容,设计模式后面还有课,到那时再深入吧。为了理解第三周的课程,我阅读了C++ Primer(中文第五版)的相关内容,看了网易云课堂上面崔毅东老师的C++程序设计入门(上)中关于继承的部分,从这两个来源和本周的课程,我总结了继承中的一些我掌握不好的概念。

派生类与基类之间是一种“is a”的关系,即派生类是一种基类(派生类中的一部分是基类)。基类的所有成员都会被派生类继承继承的是调用权,即子类可以像父类一样工作,调用父类的成员(函数和数据)。

派生类不继承的函数包括:基类的析构函数,友元函数和赋值运算符。

派生类构造函数必须调用基类的构造函数。在创建派生类对象时会调用基类的构造函数,派生类的实例会按照从基类到派生类的顺序沿着继承链调用所有的基类构造函数。若基类的构造函数没有被显式地调用,则基类的无参构造函数会被调用(如果基类没有无参构造函数,编译器会报错,因此为类写一个=default构造函数是一个好习惯)。如果想用除基类无参构造函数之外的其他构造函数,需要进行显式调用。

在一个继承链中,析构函数的调用顺序与构造函数的调用顺序相反。

多态

广义的多态:不同对象对相同的消息有不同的响应。截至目前,多态表现为重载和重定义。

//重载
    class C
    {
        int f() {};
        int f(int i) {};
    };
//重定义
class Base
{
public:
    int f() {};
};
class Derived : public Base
{
public:
    int f() {};
};

重载函数与重定义函数的区别:

重载函数:只在参数上有区别(类型,数量,顺序)。

重定义函数:在基类和派生类中分别定义,同名,同参数(类型,数量,顺序都一致),同返回类型。派生类中的重定义函数会覆盖掉基类中的同名函数。

访问控制(Accessibility)

1.基类中的访问说明符:

private:只能由类内函数访问

public:被任意其他类访问

protected:可被派生类成员(注意,不是派生类对象)访问

2.派生类中的访问说明符:

(1).公有继承

基类成员在派生类中的访问属性不变。

派生类的成员函数可以访问基类的公有成员和受保护成员。

(2).私有继承

基类成员在派生类中的访问属性都变成私有的。

派生类的成员函数可以访问基类的公有成员和受保护成员。

派生类之外的其他函数不可以通过派生类对象访问从基类继承来的任何成员。

(3).受保护继承

基类中的公有成员和受保护成员在派生类中的访问属性都变成受保护的。基类的私有成员仍是私有的。

派生类的成员函数可以访问基类的公有成员和受保护成员。

派生类之外的其他函数不可以通过派生类对象访问从基类继承来的任何成员。

私有继承与受保护继承的区别在于:私有继承中,孙类(派生类的派生类)的成员函数无法访问子类从父类继承来的所有成员;而受保护继承中,孙类(派生类的派生类)的成员函数可以访问子类从父类继承来的公有成员和受保护成员,因为它们在子类中都是受保护的。

抽象基类与虚函数

继承链越往上就越抽象,越往下越具体。因为过于抽象而无法实例化(为之创建对象)的类就是抽象类。含有纯虚函数的基类就是抽象基类。

原文地址:https://www.cnblogs.com/Dana-coder/p/8326138.html

时间: 2024-10-12 23:21:55

Boolan 第三周笔记的相关文章

第三周笔记 c++ Boolan

本周主要学习了c++中类与类之间的关系,主要有: 1)继承(Inheritance): 2)复合(Composition): 3)委托(Delegation): 一.复合: 类 queue 里有 deque ,其中类 queue 为容器,其拥有了 deque,该种关系即为复合,表示 has-a.其两者一起出现. 从内存角度看待该种关系: 复合关系下的构造函数和析构函数: 构造函数由内而外: Container 的构造函数首先调用Component的默认构造函数,然后才执行自己.具体过程如下:注意

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在linux内核源码里面arch占有的代码量相当庞大.arch/x86目录下的代码是我们重点关注的. 2.内核启动相关的代码基本都在init目录下(main.c). start_kernel是初始化linux内核的起点. start_kernel相当于c程序中的main函数 3.linux内核的核心代码在k

perl正则表达式第三周笔记

正则引擎的分类 正则引擎的分类 正则引擎的分类主要分两种: DFA:egrep.awk.lex.flex NFA:.NET.PHP.Perl.Ruby.Python.GNU Emacs.ed.sec.vi.grep等 NFA的历史比DFA久一点,但两种引擎都发展了20多年,产生了很多变体,POSIX的出现就是为了规范这种现象.POSIX不但规定了元字符的特性,而且规定了正则表达式应该用什么样的方式运作. DFA符合POSIX的标准,但NFA如果要符合POSIX标准,就要作出相应的修改 所以引擎可

信息安全系统设计基础第三周笔记

信息的表示和处理 1.三种数字表示 无符号 基于传统二进制表示法,表示大于或者等于零的数字. 补码 表示有符号整数的最常见方式 浮点数 表示实数的科学计数法的以二为基数的版本. 2.信息存储 1.进制 二进制.八进制.十进制.十六进制(转换:以二进制作为中间变量) 十六进制:以0x或0X开头表示,字符A-F可大写可小写. 2.字 虚拟地址是以这样的一个字来编码的. 每台计算机都有一个字长,指明整数和指针数据的大小. 字长决定虚拟地址空间的最大大小,字长决定的最重要的系统参数就是虚拟地址空间的最大

C++面向对象高级编程(上) 第三周笔记 GeekBand

复合:has a 构造由内而外: Container的构造函数首先调用component的default(默认)构造函数,然后再执行自己的构造函数: Container::container(...):component(){...}: 析构由外而内: Container的析构函数首先析构自己,然后再析构component: Container::~container() {... ~component()}: Delegation:has a (composition by reference

第三周笔记150206201

(第三周笔记)-(150206315)——(计算机软件技术基础)

第三周课堂笔记请上传

第三周课堂笔记提交地址: https://edu.cnblogs.com/campus/bjgygd/EIE15-1Computersoftwaretechnologyfoundation/homework/316

linux三周第2 次课笔记

三周第2 次课笔记3.4 usermod命令3.5 用户密码管理3.6 mkpasswd命令 3.4 usermod命令usermod修改账户的各项设置 3.5 用户密码管理 3.6 mkpasswd命令mkpasswd是make passwd的缩写,生成随即密码. 原文地址:http://blog.51cto.com/461565/2069772