zoukankan      html  css  js  c++  java
  • 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 "); } 

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

  • 相关阅读:
    【设计模式】——抽象工厂模式
    【设计模式】——观察者模式
    Candy
    Two Sum
    Interleaving String
    Longest Valid Parentheses
    【设计模式】——建造者模式
    【设计模式】——外观模式
    Simplify Path
    Word Search
  • 原文地址:https://www.cnblogs.com/findumars/p/4684547.html
Copyright © 2011-2022 走看看