區分:派生類指定基類建構函式、繼承構造、委託構造

招財進寶發表於2024-10-16
  • 普通的和委託的區別是:同一個類,多個類之間【派生類-基類】
  • 普通的和繼承構造的區別:是否要手動指明
// 1. 派生類顯示呼叫基類建構函式初始化
class A {
public:
    A(int x, int y) {
        std::cout << "A(x, y) called" << std::endl;
    }
};

class B : public A {
public:
    B(int a, int b, int c) : A(a, b) {   // 手動呼叫A的建構函式
        std::cout << "B(a, b, c) called" << std::endl;
    }
};

int main() {
    B obj(1, 2, 3); 
}

// 特點:手動指定基類的建構函式,不能自動繼承構造。

// 2. C++11, 使用using自動繼承基類的建構函式
class A {
public:
    A(int x, int y) { }
};

class B : public A {
public:
    using A::A;   // 繼承基類A的建構函式
};

int main() {
    B obj(1, 2);  // 直接使用A的建構函式
}

// 特點:自動繼承建構函式,不需要顯式初始化基類。

// 3. C++11, 委託構造:在同一個類中,一個建構函式呼叫另一個建構函式
class A {
    int m_a, m_b;
public:
    A(int x, int y) : m_a(x), m_b(y) {
        cout << "A(int, int)" << endl;
    }
    
    // 委託構造:委託給 A(int, int) 進行初始化
    A(int x, int y, const string& str) : A(x, y) {
        cout << "str = " << str << endl;
    }
};

// 特點:同類中不同建構函式之間的複用,適合程式碼共享。

相關文章