C++ 日常笔记(5)

来源:互联网 发布:博雅软件 编辑:程序博客网 时间:2024/06/02 06:36

1.虚函数
可以为纯虚函数提供定义,但是只能在类的外部提供函数定义。

一般情况下,派生类覆盖基类的虚函数时,返回类型需要与其一致。但是,当类的虚函数的返回类型是类本身的指针或引用时,该规则可以不被遵循。如:D由B继承而来,B中的一虚函数的返回类型为B*,D覆盖该函数的时候,可以将该函数的返回类型改为D*(这里隐式要求D到B的类型转换是可访问的)。

虚函数也可以有默认实参,但是当我们使用基类的指针、引用来调用该虚函数,则会使用该虚函数在基类的默认实参,即:若某虚函数调用使用默认实参,则该实参由本次调用的静态类型决定。

2.友元函数
派生类的成员或友元只能通过派生类对象来访问基类对象的保护成员,派生类队一个基类对象的保护成员并没有特殊的访问权限。

3.派生类
派生类覆盖基类的虚函数时,可不在其函数前加virtual关键字(因为一旦基类申明一个函数为虚函数,派生类无论覆盖多少次,它都是虚函数)。此外,C++11提供override关键字,以便更清楚的表示派生类使用哪个成员函数覆盖基类的虚函数(override应位于派生类的该函数的形参列表后)。

派生类在声明的时候,不能包括其派生列表,只有在其定义的时候,才能指出其基类。此外,当派生类指出某类为其基类时,该类需要已经被定义,而不是仅仅被声明。

若不想一个类被其他类继承,C++11提供了关键字 final,可以在类名后面添加final,以达到禁止其他类继承该类的目的。

4.模版
这样的语句是存在二义性的:

T::size_type * p;

有可能size_type是一个类型,也有可能是一个static数据成员。

C++一般默认我们通过::(作用域运算符)访问的名字不是类型,若我们需要通过其访问模版类中的类型,需要使用typename关键字指出。如:

 typename T::size_type * p;

函数模版显示实例化:

template [函数返回类型] [函数模版名]<实际类型列表>(函数参数列表)

类模版显示实例化:

template class [类模版名]<实际类型列表>

资料来源:
《C++ Primer中文版(第五版)》