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