正如您在標題中看到的,我需要在下面的代碼中找到錯誤,這是我所知道的:
- 我知道為了在 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();
}
uj5u.com熱心網友回復:
我認為您的標題具有誤導性,但問題是有效的。
為了構造 B,A 也需要構造(你知道),但是在不知道其建構式中的值的情況下如何構造 A int i?
但是您可以使用 B 的無引數建構式為 提供值i:
struct B : public A {
public:
B(): A(53 /* value for int i */) { }
...
但除非你指定 B 應該使用 A 的建構式,否則編譯器將搜索默認建構式(在 A 的情況下不存在)
uj5u.com熱心網友回復:
神奇之處在于,在進入建構式的主體之前,所有成員變數和基類都必須已完全構造好。
那就是A必須構造,A(int i)必須呼叫,那this-> i = i;是賦值,不是初始化,不能代替的建構式i執行的初始化。A
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417718.html
標籤:
上一篇:如果比較qstrings時崩潰
下一篇:回傳沒有型別名稱的聚合初始化
