10_c++再论构造函数

来源:互联网 发布:淘宝如何找相似图片 编辑:程序博客网 时间:2024/06/06 09:38

c++再论构造函数

1、构造顺序

先父后儿

解释:a,先调用父类的构造函数,如果有虚拟基类则先调用虚拟基类的构造函数,再调用一般基类的构造函数。b,父类构造函数调用完后再调用自己:本类中如果有对象成员,则先调用对象成员的构造函数,再调用本类的构造函数。

class Furniture {private:    int weight;public:    void setWeight(int weight) { this->weight = weight; }    int getWeight(void) const { return weight; }public:    Furniture() { cout <<"Furniture()"<<endl; }};class Vertification3C {public:    Vertification3C() { cout <<"Vertification3C()"<<endl; }};class Sofa : virtual public Furniture , virtual public Vertification3C{private:    int a;public:    void watchTV(void) { cout<<"watch TV"<<endl; }public:    Sofa() { cout <<"Sofa()"<<endl; }};class Bed : virtual public Furniture, virtual public Vertification3C {private:    int b;public:    void sleep(void) { cout<<"sleep"<<endl; }public:    Bed() { cout <<"Bed()"<<endl; }};class Sofabed : public Sofa, public Bed {private:    int c;public:    Sofabed() { cout <<"Sofabed()"<<endl; }};class LeftRightCom {public:    LeftRightCom() { cout <<"LeftRightCom()"<<endl; }};class Date {public:    Date() { cout <<"Date()"<<endl; }};class Type {public:    Type() { cout <<"Type()"<<endl; }};class LeftRightSofabed : public Sofabed, public LeftRightCom {private:    Date date;    Type type;public:    LeftRightSofabed() { cout <<"LeftRightSofabed()"<<endl; }};int main(int argc, char **argv){    LeftRightSofabed s;    return 0;}

结果:

Furniture()         /* 先虚拟基类 */Vertification3C()Sofa()Bed()Sofabed()LeftRightCom()Date()Type()LeftRightSofabed()

分析:

Furniture,Vertification3C   Furniture,Vertification3CSofa                        Bed        Sofabed                     LeftRightCom        LeftRightSofabed

2、多继承怎么给父类有参构造函数传递参数

使用如下方式:

class LeftRightSofabed : public Sofabed, virtual public LeftRightCom {private:    Date date;    Type type;public:    LeftRightSofabed() { cout <<"LeftRightSofabed()"<<endl; }    //给父类传递参数    LeftRightSofabed(char *str1, char *str2, char *str3) : Sofabed(str1), LeftRightCom(str2), date(str3) { cout <<"LeftRightSofabed()"<<endl; }};int main(int argc, char **argv){    LeftRightSofabed s("abc", "2343", "yyy");    return 0;}