Multiple Inheritance: Một class dẫn xuất từ nhiều base class. Kế thừa tính năng từ nhiều nguồn.
Cú pháp
class Derived : public Base1, public Base2, ... {
// members
};
Ví dụ cơ bản
#include <iostream>
using namespace std;
class A {
public:
int a = 5;
A() { cout << "Constructor A\n"; }
};
class B {
public:
int b = 10;
B() { cout << "Constructor B\n"; }
};
class C : public A, public B { // Kế thừa cả A và B
public:
int c = 20;
C() { cout << "Constructor C\n"; }
};
int main() {
C obj;
cout << "a = " << obj.a << ", b = " << obj.b << ", c = " << obj.c << '\n';
return 0;
}
Kết quả
Constructor A Constructor B Constructor C a = 5, b = 10, c = 20
Thứ tự khởi tạo/hủy
- Base classes: theo thứ tự khai báo trong
class C : public A, public B(A trước, B sau) - Member variables: theo thứ tự khai báo trong class
- Derived constructor body
- Hủy: ngược thứ tự (Derived → Member → Base B → Base A)
Vấn đề: Diamond Problem (Vấn đề kim cương)
Base
/ \
Derived1 Derived2
\ /
Final
Nếu không dùng virtual inheritance → Final có 2 bản sao Base → ambiguity.
Giải pháp: Virtual Inheritance
class Base {
public:
int value = 42;
};
class Derived1 : virtual public Base {}; // Virtual
class Derived2 : virtual public Base {}; // Virtual
class Final : public Derived1, public Derived2 {
public:
void show() { cout << value; } // OK: chỉ 1 Base subobject
};
So sánh
| Kế thừa thường | Virtual Inheritance | |
|---|---|---|
| Mỗi path tạo 1 base subobject | Chỉ 1 base subobject chung | |
| Gây ambiguity nếu diamond | Giải quyết ambiguity | |
| Layout đơn giản | Phức tạp (vptr/vtable thêm) | |
| Hiệu năng | Truy cập trực tiếp | Indirect (thường qua vptr) |