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

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

  • 相关阅读:
    <COM原理和应用>第七章的ITextObject代码是什么?
    CString转换成char*
    COM的永久接口
    复合文档实现结构化存储的一些限制
    COM结构化存储中存储对象或者流对象的命名规则
    VS2008:Failed to return new Code Element
    MFC COM调用时出现E_OUTOFMEMORY错误
    红米NOTE应用闪退(包括系统设置等各种界面)问题解决经历
    C++中用完需要释放掉内存的几个类
    QT For Android 运行的时候找不到手机怎么办?
  • 原文地址:https://www.cnblogs.com/findumars/p/4684547.html
Copyright © 2011-2022 走看看