• 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 
    "); }
        ~A() { printf(" ~A 
    "); } 
    };
    
    class B : public A
    {
    public:
        B() { printf("B 
    "); } // 找不到同签名的父类构造函数不一致,因此出错
        ~B() { printf("~B 
    "); }
    };
    
    int main(int argc, char* argv[])
    {
        printf("Hello World!
    ");
        return 0;
    }

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

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

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

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

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

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

  • 相关阅读:
    jeecms 强大的采集功能优化 转载 https://blog.csdn.net/jeff06143132/article/details/7099003
    JEECMS自定义标签开发步骤
    jeecms之全文检索
    jeecms怎么修改后台访问路径?
    jeecms 基本架构研究
    Java JNI初探
    《高效程序员的45个习惯》
    Java并发编程:Thread类的使用
    Thread详解
    JAVA多线程实现的四种方式
  • 原文地址:https://www.cnblogs.com/findumars/p/4684547.html
Copyright © 2020-2023  润新知