笔记-2017.10.24

来源:互联网 发布:朋友圈视频转发软件 编辑:程序博客网 时间:2024/06/05 08:14

1.指向基类的指针无法指向由私有和保护继承而来的派生类,因为在派生类中基类数据无法直接访问,仅公有继承可以。对于继承方式为protectedprivate的派生类对象,基类的公有成员、私有成员和保护成员都是不可见的,所以你把基类指针指向protectedprivate继承的派生类对象时,对于基类的公有成员,这个对象到底能不能访问到呢?他是基类指针,若是基类对象就该能访问,但指向的是这两种方式继承的对象,按理又不能访问,矛盾了,所以不允许他指向这样的对象

2.指向普通函数的指针格式为:ReturnVal (*ptr)(<参数列表>)

3.指向成员函数的指针格式为: ReturnVal (ClassName::*ptr)(<参数列表>),使用格式为(Class.*ptr)(<参数列表>)

4.保护继承中,private类型虽为protected,但是被隐藏,派生类中无法访问

5.虚基类的使用情景,现有一派生类由若干个基类继承而来,而这些基类都是由另一个共同基类派生而来,为了使该派生类中只含有一份间接基类成员,可以通过使该间接基类为虚基类,并由若干直接基类继承

6.MI中,为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承(这会造成大量的不可预知的二义性问题)。

7.“有4种情况,会造成“编译器必须为未声明constructorclasses合成一个default constructor”。C++ standard把那些合成物称为implicit nontrivial default constructor。被合成出来的constructor只能满足编译器(而非程序)的需要。它之所以能够完成任务,是借着“调用member objectbase classdefault constructor”或是“为每一个object初始化其virtual function机制或virtual base class机制”而完成的。至于没有存在那4种情况而又没有声明任何constructorclasses,我们说它们拥有implicit trival default constructor,它们实际上并不会被合成出来”

“在合成的default constructor中,只有base class subobjectsmember class objects会被初始化,所有其他的nonstatic data member都不会被初始化,这些初始化操作对程序而言或许有需要,但对编译器则非必要”

——<深入探索C++对象模型>47

(这澄清了两个误区:1.任何class如果没有定义default constructor,就会被合成出一个出来;2.编译器合成出来的default constructor会显式设定class内每一个data member的默认值)

原创粉丝点击