c++ 子类与父类的构造函数继承关系

规范上,子类构造函数肯定是会调父类的构造函数。
 
如果代码中没写,就会隐含调用父类的默认构造函数(即那个无参构造函数)。如果父类没有,编译报错。
 
1,展示了当子类要调用父类中带参数的构造函数 时:
#include <iostream>
#include <cstdio>

class A {
public:
    A() { printf("A(void) \n"); }
    A(int d) { printf("A %d\n", d); }
    ~A() { printf(" ~A \n"); }
};

class B : public A {
public:
    B() {
        printf("B(void) \n");
    }

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

    ~B() { printf("~B \n"); }
};

int main(int argc, char* argv[]) {
    B c;
    B b(8); // This also automatically calls the same signature constructor of A
    return 0;
}
2,如果子类没有调用父类,
以前的
    B(int x) : A(x) {
        printf("B \n");
    }
改成了
    B(int x) : A(x) {
        printf("B \n");
    }
这是默认调用 A() 这个构造。
 
如果去掉 A() { printf("A(void) \n"); } 构造, 
    B(int x) : A(x) {
        printf("B \n");
    }
这个编译不过。因为没有默认 A()了。
 
 
输出结果:
 
 
 
 
 
一句一句分析:
 
B  c;         
 
//首先调用A的无参(默认)构造函数,然后调用B的无参构造函数。
 
//所以先输出A(void),然后是B(void)
 
 
 
B  b(8);    
 
//首先调用A的有参构造函数,然后调用B的有参构造函数。
 
//所以先输出A 8,然后是B
 
 
 
 
 
如果,没有显示调用A的有参构造函数呢? 
 
答案是:不会调用A的有参构造函数,只会调用A的无参(默认)构造函数。如下图:
 
 
 
 
 
 
 
 
 
 
 
========================
 
 
 
 
 
 
————————————————
版权声明:本文为CSDN博主「奔跑的龙少」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shine_journey/article/details/53188682
posted @ 2023-05-19 11:44  Bigben  阅读(278)  评论(0编辑  收藏  举报