• 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 "); } 

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

  • 相关阅读:
    BeanPostProcessor后置处理器原理以及ApplicationListener原理
    SpringCloud之服务注册与发现Eureka+客户端Feign
    AJPFX关于TreeSet集合的介绍
    AJPFX:关于面向对象的封装
    AJPFX总结Java 类与对象的初始化
    AJPFX关于增强for的概述和使用(foreach)
    AJPFX总结泛型概念和使用
    AJPFX简述可变参数概述和使用
    AJPFX关于JAVA StringBuffer的用法总结
    AJPFX关于Collection 集合的表述
  • 原文地址:https://www.cnblogs.com/findumars/p/4684547.html
Copyright © 2020-2023  润新知