为什么要在 Derived Class 中使用默认构造函数,我们需要在 Base Class 中使用默认构造函数
Why in order to use default constructor in Derived Class, we need a default constructor in the Base Class
正如你在标题中看到的,我需要在下面的代码中找到错误,
这是我所知道的:
- 我知道为了在 B 中使用默认构造函数,我们需要在 A 中使用默认构造函数
我不知道的是:
- 为什么?我想这是因为 B 继承了 A 但我需要确切地知道为什么
代码如下:
#include <iostream>
using namespace std;
class A
{
protected:
int i;
public:
A(int i) :i (i) {}
};
struct B : A
{
B() {}
void set(int i) { this-> i = i; }
void print() { cout << i << endl; }
};
int main()
{
B b; b.set(2);
b.print();
}
我认为你的标题具有误导性,但这个问题是有效的。
为了构建B,A也需要构建(你知道的)
但是如何在 A 的构造函数中不知道 int i
的值的情况下构造它?
但是您可以使用 B 的 parameter-less 构造函数为 i
:
提供值
struct B : public A {
public:
B(): A(53 /* value for int i */) { }
...
但除非您指定 B 应该使用 A 的构造函数,否则编译器将搜索默认构造函数(在 A 的情况下不存在)
魔术酱是在进入构造函数的主体之前all member variables and base classes must have been fully constructed。
表示必须构造A
,必须调用A(int i)
,而this-> i = i;
是赋值,不是初始化,不能代替[=13=的初始化] 由 A
的构造函数执行。
正如你在标题中看到的,我需要在下面的代码中找到错误, 这是我所知道的:
- 我知道为了在 B 中使用默认构造函数,我们需要在 A 中使用默认构造函数
我不知道的是:
- 为什么?我想这是因为 B 继承了 A 但我需要确切地知道为什么
代码如下:
#include <iostream>
using namespace std;
class A
{
protected:
int i;
public:
A(int i) :i (i) {}
};
struct B : A
{
B() {}
void set(int i) { this-> i = i; }
void print() { cout << i << endl; }
};
int main()
{
B b; b.set(2);
b.print();
}
我认为你的标题具有误导性,但这个问题是有效的。
为了构建B,A也需要构建(你知道的)
但是如何在 A 的构造函数中不知道 int i
的值的情况下构造它?
但是您可以使用 B 的 parameter-less 构造函数为 i
:
struct B : public A {
public:
B(): A(53 /* value for int i */) { }
...
但除非您指定 B 应该使用 A 的构造函数,否则编译器将搜索默认构造函数(在 A 的情况下不存在)
魔术酱是在进入构造函数的主体之前all member variables and base classes must have been fully constructed。
表示必须构造A
,必须调用A(int i)
,而this-> i = i;
是赋值,不是初始化,不能代替[=13=的初始化] 由 A
的构造函数执行。