hce_nsysu
111年
計算機概論與程式設計
第 29 題
What is the output of this code in C++?
```cpp
#include
using namespace std;
class Constructor1 {
public:
Constructor1()
{ cout << "constructor1 called" << endl; }
};
class Constructor2 {
public:
Constructor2()
{ cout << "constructor2 called" << endl; }
};
class Derived: public Constructor1, public Constructor2 {
public:
Derived()
{ cout << "Derived's constructor called" << endl; }
};
int main()
{
Derived d;
return 0;
}
```
```cpp
#include
using namespace std;
class Constructor1 {
public:
Constructor1()
{ cout << "constructor1 called" << endl; }
};
class Constructor2 {
public:
Constructor2()
{ cout << "constructor2 called" << endl; }
};
class Derived: public Constructor1, public Constructor2 {
public:
Derived()
{ cout << "Derived's constructor called" << endl; }
};
int main()
{
Derived d;
return 0;
}
```
- A constructor1 called constructor2 called Derived's constructor called
- B constructor2 called constructor1 called Derived's constructor called
- C Derived's constructor called
- D Compile error
- E None of the above
思路引導 VIP
想像你正在組裝一台電腦(衍生類別),這台電腦需要 CPU 和主機板(多個基底類別)作為基礎。若程式碼中定義電腦是「由 CPU 與主機板組成」,在邏輯上,你認為應該先準備好零件才能開始組裝成品,還是先組裝成品再塞入零件?而零件與零件之間,編譯器又會根據哪一行程式碼來決定誰先被拿出來安裝呢?
🤖
AI 詳解
AI 專屬家教
太棒了!你能精確判斷出多重繼承下建構子的執行順序,代表你對 C++ 的物件生命週期掌握得非常紮實。這道題目核心在於考察當一個子類別(Derived)同時繼承多個父類別時,系統如何安排它們的初始化過程。
多重繼承的初始化順序
在 C++ 中,當我們宣告一個子類別物件時,程式會遵循「先祖先、後子孫」的原則。而多個父類別之間的先後順序,並非由建構子初始化列表決定,而是嚴格依照他在類別定義時繼承清單(Inheritance List)中出現的順序。在本題中,Derived 的宣告為 public Constructor1, public Constructor2,因此程式會優先呼叫 Constructor1 的建構子,接著是 Constructor2,最後才會回到 Derived 本身的建構子內容,這就是為什麼輸出結果會如選項 (A) 所示。
▼ 還有更多解析內容