首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 成員初始化列表中調用基類拷貝構造與成員賦值的正確姿勢

     編輯:程式設計綜合問答

問題代碼

class Manager : public Person {
    int a;
public:
    Manager(const Manager& m) : Person(m), a(m.a) { }
};

編譯錯誤原因

若報錯「m.a 無可用成員」,通常是 基類 Person 的拷貝構造函數參數類型不匹配,導致 Person(m) 調用失敗,隨後 m.a 解析上下文錯誤。請檢查:

  1. Person 是否聲明 Person(const Person&) 或 Person(const Manager&)?
  2. Person 的拷貝構造是否被 delete 或 private?
  3. Manager 是否多重繼承導致切片問題?

正確示範

class Person {
public:
    Person(const Person& other) = default; // 確保可用
    // ...
};

class Manager : public Person {
    int a;
public:
    Manager(const Manager& m) : Person(m), a(m.a) { } // 正確
    // C++11 委託構造寫法
    Manager(const Manager& m) : Manager(static_cast(m)) {
        a = m.a;
    }
};

驗證代碼

class A { public: int a; };
class B { public: B(int a) {} };
class C { B b; public: C(const A& a) : b(a.a) {} }; // 編譯通過
int main() {}

上述代碼在 codepad 驗證通過,說明成員初始化列表中 a.m 訪問基類公有成員完全合法。

避坑指南

  • 基類拷貝構造務必 public 且未刪除。
  • 派生類拷貝構造先調用基類拷貝構造,再初始化自身成員。
  • 優先使用 = default 讓編譯器生成正確拷貝/移動操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved