C++ Primer 笔记12

来源:互联网 发布:python 重定向 编辑:程序博客网 时间:2024/05/29 19:55
1、在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。
2、除了构造函数之外,任意非static成员函数都可以是虚函数。保留字virtual只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。
3、派生类中虚函数的声明必须与基类中的定义完全匹配,但有一个例外:返回对基类型的引用(或指针)的虚函数。派生类中的虚函数可以返回基类函数所返回类型的派生类的引用(或指针)。
4、一旦函数在基类中声明为虚函数,它就一直为虚函数,派生类无法改变该函数为虚函数的这一事实。派生类冲定义虚函数时,可以使用virtual保留字,但不是必须这样做。
5、只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制。派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会再运行时确定并且将是一个自身调用,从而导致无穷递归。
6、派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或更宽松。
class Base{
   public:
     std::size_t size() const{return n;}
   protected:
     std:size_t n;
};
class Derived : private Base{...};
  为了使size在Derived中成为public,可以在Derived的public部分增加一个using声明。如下:
class Derived : private Base{
   public:
      using Base::size;
   protected:
      using Base::n;
};
7、友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。 如果基类和派生类都需要访问另一个类,那个类必须特地将访问权限授予基类和每一个派生类。
8、static成员遵循常规访问控制:如果成员在基类中为private,则派生类不能访问它。假定可以访问成员,则既可以通过基类访问static成员,也可以通过派生类访问static成员。一般而言,既可以通过作用域操作符也可以使用点或箭头成员访问操作符。
9、要确定到基类的转换是否可访问,可以考虑基类的public成员是否可访问,如果可以,转换是可访问的,否则,转换是不可访问的。
10、派生类构造函数的初始化列表只能初始化派生类的成员,不能直接初始化继承成员。相反,派生类构造函数通过将基类包含在构造函数初始化列表中来间接初始化继承成员。首先初始化基类,然后根据声明次序初始化派生类的成员。
11、一个类只能初始化自己的直接基类。
12、重构:重构包括重新定义类层次,将操作和/或数据从一个类移到另一个类。为了适应应用程序的需要而重新设计类以便增加新函数或处理其他改变时,最有可能需要进行重构。
13、如果派生类定义了自己的复制构造函数,该复制构造函数一般应显式使用基类复制构造函数初始化对象的基类部分。编译器总是显式调用派生类对象基类部分的析构函数。 一般,即使析构函数没有工作要做,继承层次的根类也应该定义一个虚析构函数。
14、C++继承层次中确定函数调用,要遵循以下4个步骤
① 首先确定进行函数调用的对象、引用或指针的静态类型
②在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关基类中找到该名字,则调用是错误的。
③ 一旦找到了该名字,就进行常规类型检查,查看如果给定找到的定义,该函数调用是否合法。
④假定函数调用合法,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数。
15、含有(或继承)一个或多个纯虚函数的类是抽象基类(abstract baseclass)。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。
原创粉丝点击