Khi kế thừa một hoặc nhiều lớp cha, chúng ta thường sử dụng lại phương thức khởi tạo (constructor method) của lớp cha vì cos nhiều lợi ích khác nhau như không phải viết lại cùng một đoạn code, khi sửa chỉ cần sửa 1 nơi,…
Sử dụng lại constructor trong C++
Để sử dụng constructor của lớp cha, chúng ta khai báo constructor của lớp con có dạng như sau:
LopCon::LopCon(type var1, type var2) : LopCha(var1, var2) { // code của bạn }
Ví dụ minh họa
Giả sử chúng ta có lớp A như sau:
class A { protected: int x; public: A() { x = 0; } A(int x) { this->x = x; } void xuatA() { std::cout << “x = ” << x << “n”; } };
Và lớp B kế thừa lớp A:
class B: public A { private: int y; public: B(int x, int y) : A(x) {// su dung constructor cua lop A this->y = y; } void xuatB() { A::xuatA(); // su dung method cua lop A std::cout << “y = ” << y << “n”; } };
Như các bạn thấy, trong ví dụ trên tôi đã sử dụng lại constructor của lớp A khi cài đặt constructor của lớp B, kết quả là tôi không phải viết lại đoạn code khởi tạo cho biến x mà chỉ phải viết đoạn code khởi tạo cho biến y
Nhìn xuống phía dưới, các bạn sẽ thấy dòng A::xuatA();, đó là cách sử dụng member của một lớp mà ở đây là lớp cha. Chúng ta cũng có thể sử dụng cách này để gọi static member của bất kì lớp nào với cú pháp như sau:
TenLop::TenMember
Toàn bộ code của chương trình minh họa:
/* Su dung member cua lop cha */ #include <iostream> class A { protected: int x; public: A() { x = 0; } A(int x) { this->x = x; } void xuatA() { std::cout << “x = ” << x << “n”; } }; class B: public A { private: int y; public: B(int x, int y) : A(x) {// su dung constructor cua lop A this->y = y; } void xuatB() { A::xuatA(); // su dung method cua lop A std::cout << “y = ” << y << “n”; } }; int main() { A a; B b(5, 10); a.xuatA(); b.xuatB(); return 0; }
Kết quả khi chạy:
$ ./a.out x = 0 x = 5 y = 10
So sánh với việc sử dụng contructor của lớp cha trong Java
Nếu bạn nào đã code Java thì sẽ thấy là trong Java tiện hơn rất nhiều vì có từ khóa super, điều này cũng dễ hiểu vì trong Java chỉ cho phép đơn kế thừa , do vậy từ khóa super luôn tham chiếu đến lớp cha duy nhất mà nó kế thừa, không có sự nhầm lẫn nào ở đây cả.
Trong khi đó, C++ cho phép đa kế thừa, do vậy phải dùng tên lớp để xác định chính xác lớp cha chứ không thể dùng từ khóa super như trong Java vì sẽ không biết là super tham chiếu đến lớp cha nào khi có nhiều hơn 1 lớp cha.
-sangnd (sangnd.info)