C++primer阅读笔记---------------面向对象程序设计

该博客用于记录自己在阅读过程中不懂的知识点,很少用到但比较重要的知识点以及模棱两可的知识点



对于某些函数基类希望派生类定义自己的版本,便将它声明成虚函数,在函数前加virtual,声明时加定义时不加


在覆盖基类虚函数的函数后加上override关键字

当使用引用或指针调用虚函数时,该调用将被动态绑定

如果基类把一个函数声明为虚函数,则派生类中也会隐式的变为虚函数

基类的指针和引用可以绑定派生类对象(实际绑的是基类部分),也可以将派生类对象当作基类来使用

派生类初始化时基类部分调用基类构造函数来完成

静态成员在整个继承体系中只存在唯一的实例

派生类的声明不加派生列表

类名后面加上final则不能作为基类

对象之间不存在类型转换,因为用一个派生类对象初始化基类对象(或拷贝),实际上都是调用的基类的构造函数或拷贝赋值运算符,而参数是基类的引用,所以又回到了上面的某条规定,基类的引用实际上是绑定的派生类的基类部分,所以只会拷贝(赋值)基类部分,而派生类特有的部分可以理解为被“切掉了”

所有虚函数都必须都定义,(只有)使用基类的引用或指针调用虚成员函数时会发生动态绑定,在执行时决定调用哪个版本的虚函数

派生类的函数类型应该与基类一样,但返回类型是类本身的指针或者引用时,可以返回自己类相关的而不是与基类一样

使用默认实参时,默认实参的值由静态类型决定(即调用该函数的类型的实参版本)

含有纯虚函数的类(抽象基类)不能定义对象,它的派生类将会使用抽象基类的构造函数来构建派生类的基类部分,且派生类必须覆盖纯虚函数后才能定义对象

每个类都应该有自己的构造函数,即使它在基类的基础上没有新的数据成员,好的方法是调用基类的构造函数来构造

派生类的成员和友元只能访问派生类对象中的基类部分的受保护成员

公有继承不变,私有继承都变私有,保护继承公有变保护(其他不变)

当D公有继承B的时候,用户代码才可以使用派生类向基类的转换,无论什么继承方式,D的成员函数和友元都可以使用派生类向基类的转换,D继承B的方式是公有或保护,D的派生类能使用D到B的转换

友元关系不能传递也不能继承

派生类可以为那些它可以访问的名字提供using声明改变它的可访问性

默认继承

派生类的函数会隐藏调基类的同名函数(作用域),即使参数列表不一样,这里提一下,如果派生类和基类的虚函数只有名字一样参数列表不一样的话,派生类会隐藏基类的虚函数,而不是覆盖

如果派生类需要基类的所有重载版本它都可见的话,要么覆盖所有版本要么一个也不覆盖,这样会显得很繁琐,所以我们使用using指定一个名字而不指定参数列表,就可以把基类的所有重载实例添加到派生类中

我们delete一个动态分配的对象时有可能出现静态类型和动态类型不匹配的情况,灵活运用虚函数就可以解决,于是就有了虚析构函数

派生类只销毁自己分配的资源,对象的成员是被隐式销毁的,基类部分也是隐式销毁的

和构造函数一样,为派生类定义拷贝或移动构造函数时通常使用基类的构造函数初始化对象的基类部分
class base {/****/};
class D:public base{
public:
D(const D& d):base(d){/**/}
D(D&& d):base(std::move(d)){/***/}
D &D::operator=(const D &rhs){base::operator=(rhs);/*派生类部分,以及处理自赋值等情况*/ return *this;}
}

派生类可以直接重用其直接基类定义的构造函数
using parent::parent;
对于基类的每个构造函数,派生类都会生成一个与之对应的构造函数,此时派生类自己定义的成员采用默认初始化,这里的using不会改变访问级别,及基类中的私有构造函数到派生类中生成的依然是私有
对含有默认是参的基类构造函数,编译器在派生类中会省略默认实参生成多个构造函数,例如基类一个构造函数含有3个参数,其中2个有默认实参,则会生成3个构造函数,分别有一个两个三个构造函数,而不会继承默认实参
继承的构造函数不会被作定义的构造函数,换句话说就是如果全都是继承的,则它会合成一个默认的构造函数

指向派生类的指针可以转换为指向基类的指针,考虑一个问题,当年想把有继承关系的对象存入一个容器,但一个容器只能存一种类型的对象,所以就用到了这个定义,可以定义一个基类指针的容器来存指向各个对象的指针


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值