1、面向对象编程的关键思想是多态性。
2、在C++中,基类必须指出希望派生类重定义哪些函数,定义为virtual的函数是基类期望派生类重新定义的,基类期望派生类继承的函数不能定义为虚函数。
3、在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。
4、保留字virtual只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。
5、protected成员可以被派生类对象访问但不能被该类型的普通用户访问。派生类只能通过派生类对象访问其基类的proteected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。
6、如果派生类没有重定义某个虚函数,则使用基类中定义的版本。
7、派生类中虚函数的声明必须与基类中的定义方式完全匹配,但有一个例外:返回对就类型的引用(或指针)的虚函数。派生类中的虚函数可以返回基类函数所返回类型的派生类引用(或指针)。
8、派生类重定义虚函数时,可以使用virtual保留字,但不是必须这么做。
9、因为每个派生类对象都有基类部分,类可以访问其基类的pubilc和protected成员,就好像那些成员都是派生类自己的成员一样。这一规则暗示着不可能从类自身派生出一个类。
10、最底层的派生类对象包含其每个直接基类和间接基类的子对象。
11、C++中的函数调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数;第二,必须通过基类类型的引用或指针进行函数调用。
12、倘若希望覆盖虚函数机制并强制函数调用使用虚函数的特定版本,可以使用作用域操作符。
13、在同一虚函数的基类版本和派生类版本中使用不同的默认实参几乎一定会引起麻烦。
14、我们经常误认为struct保留字定义的类与class定义的类有很大的区别,其实唯一的不同只是默认的成员保护级别和默认的派生保护级别。前者默认为public,后者默认为private。
15、友元关系不能继承。基类的友元(包括友元函数跟友元类)对派生类的成员没有特殊的访问权限。
16、如果基类定义了静态成员,则整个继承层次中只有一个这样的成员。无论基类派生出多少个派生类,每个静态成员只有一个实例。
17、如果从基类到派生类的转换是安全的,就可以使用static_cast强制编译器进行转换。或者使用dynamic_cast申请在运行时进行检查。
18、构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。像任何类一样,如果类不定义自己的默认构造函数和复制构造成员,就将使用合成版本。
19、派生类的构造函数受继承关系的影响,每个派生类构造函数除了初始化自己的数据成员之外,还要初始化基类。
20、派生类构造函数的初始化列表只能初始化派生类的成员,不能直接初始化继承成员,通常是将基类构造函数包含在其构造函数列表中来间接初始化继承成员。
21、一个类只能初始化自己的直接基类。直接基类就是在派生类列表中指定的类。不过,派生类应该使用基类构造函数尊重基类的初始化意图,而不是在派生类构造函数函数体中对这些成员赋值。
22、如果派生类定义了自己的复制构造函数,该复制构造函数一般应显式使用基类复制构造函数初始化对象的基类部分。赋值操作符通常与复制构造函数类似:如果派生类定义了自己的赋值构造函数,则该操作符必须对基类部分进行显式赋值。
23、析构函数的工作与复制构造函数和赋值操作符不同:派生类析构函数不负责撤销基类对象的成员,即每个析构函数之复制清除自己的成员。对象的撤销顺序与构造顺序相反:首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数。
24、要保证运行适当的析构函数,基类中的析构函数必须为虚函数,如果析构函数为虚函数,那么通过指针调用时,运行哪一个析构函数将因指针所指对象类型的不同而不同。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。