CPP学习备忘[8] 继承

来源:互联网 发布:nginx 多server配置 编辑:程序博客网 时间:2024/06/06 08:27
 

【1】派生类对象本体包括两个部分,一个为基类部分另一个为派生类部分。

    派生类的默认无参构造函数会首先调用父类的无参构造函数,如果父类定义了有参构造函数(因此没有默认的无参构造函数),又没有重载定义无参构造函数,则会导致编译发怒。

    并不是非得调用默认无参构造函数,可以在派生类的构造函数中规定调用基类构造函数的形式。如:

    class GraduateStudent : public Student{

        Advisor advisor;

        int qualifierGrade;

     public:

        GraduateStudent(const string& pN,Advisor adv)

            :Student(pN),advisor(adv), qualifierGrade(0){}

 

    }

 

【2】拷贝构造的方式与构造函数的方式相似,基类若没有自定义拷贝构造函数,则派生类的拷贝构造函数将调用基类的默认拷贝构造函数,否则,调用基类的自定义拷贝构造函数。

    派生类若没有自定义拷贝构造函数,则拷贝构造时调用默认拷贝构造函数。对于对象本体与对象实体不一致的情况来说,需要在派生类中自定义拷贝构造函数。

拷贝构造时面临的问题是派生类对象复制给基类对象的转换问题,这时,将按照参数传递的规则办事。

    派生类构造函数被调用时,在还没有执行构造函数体之前,立刻调用基类的构造函数。如果基类构造调用在初始化列表中存在,就按初始化列表的调用形式做;否则,就被调用相应的基类无参构造函数。

 

【3】基类的私有成员在派生类采用任何继承方式下都是隔离的,必须通过基类的保护或公有成员函数去访问它们。

    公有继承将基类的保护成员和公有成员视为自己的保护和公有成员。

    保护继承则将基类的保护和公有成员全变为自己的保护成员。

    在派生类中,可以调整成员的访问控制属性,例如将公有成员调整为私有成员,将保护成员调整为公有成员。调整访问控制属性的前提是在派生类中该成员必须是可见的。

    对于一个成熟的类设计来说,数据成员往往只是私有的,公有的不多见,那只是为了一时方便的权宜之计。而保护数据成员则更见不到,因为保护数据更多的是用于类设计中的待定考虑,倒是经常能见到保护的成员函数,它是隐藏在类内部衔接父子类关系的桥梁。

 

【4】类含有对象成员的情形称为组合。对于组合,成员对象的数据隐私是不能被直接访问的,必须通过成员对象的操作去间接访问。也就是类对象与成员对象之间是彼此独立的。

 

【5】多重继承情况下,有可能导致基类成员的名称冲突,为了明确访问的目的,必须加前缀以说明基类,如:

    SleeperSofa ss;

    ss.Sofa::setWeight(20); 

或者采用虚拟继承的方式,虚拟继承方式是在继承的关键字前面加上virtual关键字,如:

    class Sofa:virtual public Funiture{

        …

    }

为了解决从不同途径继承来的同名数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要。

 

【6】含有多继承的构造函数按下列顺序被调用:

(1)       任何虚拟基类的构造函数按照它们被继承的顺序构造。

(2)       任何非虚拟基类的构造函数按照它们被继承的顺序构造。

(3)       任何成员对象的构造函数按照它们声明的顺序构造。

(4)       类自己的构造函数。

 

原创粉丝点击