C++ Primer——面向对象程序设计

1、在C++中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数(virtual function)。

2、在C++中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定。

3、关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。

4、派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员。和其他使用基类的代码一样,派生类能访问公有成员,而不能访问私有成员。不过在某些时候基类中还有这样一类成员,基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用protected访问运算符说明这样的成员。

5、如果我们想将某个类用作基类,则该类必须定义而非仅仅声明。

6、在定义一个类时,如果不希望其他类继承它,或者不想考虑它是否适合作为一个基类。为了实现这个目的,C++11新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字final:

class NoDerived final {};                   //NoDerived不能作为基类
class Base{};
class Last final : Base{};                  //Last不能作为基类
class Bad : NoDerived { };                  //错误:NoDerived是final的
class Bad2 : Last { };                      //错误:Last是final的

7、基类的指针或引用的静态类型可能与其动态类型不一致,但是如果表达式既不是引用也不是指针,则它的动态类型永远与静态类型一一致。

8、当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝,移动或赋值,它的派生类部分将被忽略掉。

9、所有的虚函数都必须有定义。

10、当且仅当对通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。

11、一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。在这里要注意重载(Overload)和覆盖(Override)的区别,重载是函数名相同,形参不同,处于相同的空间,覆盖是函数名和形参完全相同,但应用于不同的范围(派生类和基类)。

12、处于好的设计模式的考虑,只有虚函数才能被覆盖。

13、如果派生类的虚函数拥有默认实参,最好与基类函数中的实参一致,因为调用派生类函数的时候,所用的实参都是基类函数中的实参,不会去管你派生类函数里定义的实参。

14、纯虚函数表示这个函数没有实际意义,一个纯虚函数无须定义,通过在声明语句的分号之前书写=0就可以将一个虚函数说明为纯虚函数,其中=0只能出现在类内部的虚函数声明语句处。含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类。抽象基类负责定义接口,而后续的其他类可以覆盖该接口,不能直接创建一个抽象基类的对象

15、假定D继承自B:

  • 只有当D公有地继承B时,用户代码才能使用派生类向基类的转换:如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换。
  • 不论D以什么方式继承B,D的成员函数和友元都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的。
  • 如果D继承B的方式是公有的或者受保护的,则D的派生类的成员和友元可以使用D向B的类型转换;反之,如果D继承B的方式是私有的,则不能使用。

16、派生类只能为那些它可以访问的名字提供using声明。

17、派生类的成员将隐藏同名的基类成员。如果派生类的成员与基类的某个成员同名,则派生类将在其作用域内隐藏该基类成员。即使派生类成员和基类成员的形参列表不一致,基类成员也仍然会被隐藏掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值