码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-29 00:32:09      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的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"); } 

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

 

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

标签:

原文地址:http://www.cnblogs.com/findumars/p/4684547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!