C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT.....

 

class A {
public:
    A(int d) { printf("A \n"); }
    ~A() { printf(" ~A \n"); } 
};

class B : public A
{
public:
    B() { printf("B \n"); } // 找不到同签名的父类构造函数不一致,因此出错
    ~B() { printf("~B \n"); }
};

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return 0;
}

 这样写,编译就报错。说B不能调用A的默认构造函数。改成这样后方才可以:

class A {
public:
    A() { printf("A(void) \n"); }
    A(int d) { printf("A \n"); }
    ~A() { printf(" ~A \n"); } 
};

class B : public A
{
public:
    B() { printf("B \n"); }
    ~B() { printf("~B \n"); }
};

int main(int argc, char* argv[])
{
    B b; // 此处也自动调用了A的同签名的构造函数
    printf("Hello World!\n");
    getchar();
    return 0;
}

输出结果是:A(void), B

当然也可以改成这样(显性调用):

B(int x): A(x) { printf("B \n"); } 

其实各种例子的组合举不胜举,记住它的哲学思想即可:必须调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数(此时如果没有,就出错了),原因是父类里有许多成员数据,不调用父类的构造函数对它们进行初始化怎么行呢?

 

posted @ 2015-07-28 22:25  findumars  Views(1123)  Comments(0Edit  收藏  举报