我有一个用户定义的类,比如说A.我有另一个用户定义的B类公开扩展A。
当我定义B的构造函数时,我必须在B&#39的构造函数的成员初始化列表中调用A的构造函数,否则编译器将调用默认的构造函数。
class A {
int a;
public:
A(int x = 0) {
a = x;
}
};
class B : public A {
int b;
public:
B(int x = 0) : A(2*x) {
b = x;
}
};
现在,我理解这一切背后的逻辑。但是,我想知道的是当我这样做时会发生什么:
class A {
int a;
public:
A(int x = 0) {
a = x;
}
};
class B : public A {
int b;
public:
B(int x = 0) {
A(2*x);
b = x;
}
};
我的意思是,我们都知道编译器在进入B&#39的构造函数体之前会调用A的默认构造函数。现在,B&#39的构造函数体的第一行是调用A的另一个构造函数(它接受参数)。那么,这会导致什么结果呢?每当创建子类的对象时,就会在此处调用超类的两个不同构造函数。请解释会发生什么......是否会创建两个对象或者是什么。
答案 0 :(得分:3)
这不会调用A
初始化的B
子对象的构造函数。相反,它会创建并销毁A
类型的临时对象。调用基础子对象的构造函数的唯一方法是通过初始化列表,如第一个示例所示。
答案 1 :(得分:2)
现在,B&#39的构造函数体的第一行是调用A的另一个构造函数(带参数)。那么,这会导致什么结果呢?
它构造一个临时的A
,并立即丢弃临时对象。该调用与初始化A
的{{1}}部分无关。