2012-05-23 49 views
6

Hãy có lớp như thế này:Làm thế nào để tránh các nhà xây dựng mã boilerplate?

struct Base { 
    Base() { ... } 
    Base(int) { ... } 
    Base(int,string) { ... } 
    ... 
}; 

Tôi muốn kế thừa nhiều lớp từ Base, vì vậy tôi viết

struct Son : public Base { 
    Son() : Base() { } 
    Son(int) : Base(int) { } 
    Son(int,string) : Base(int,string) { } 
}; 

struct Daughter : public Base { 
    Daughter() : Base() { } 
    Daughter(int) : Base(int) { } 
    Daughter(int,string) : Base(int,string) { } 
}; 

và tôi không cần phải thêm bất kỳ mã đơn vị thi công của con. Có thể kế thừa chúng ngầm không? Để gọi cho họ theo cùng một cách như trong Base, chỉ cần thay đổi tên? Preprocessor có thể bị lạm dụng ở đây, nhưng có cách nào khác không?

+1

C++ 11 có các nhà thầu ủy quyền. – 111111

+0

Đề xuất hoang dã: bạn có thể cân nhắc thêm một số đối số mặc định được chọn cẩn thận không? 'Con gái (int i = 0, string s =" Hello "): Base (i, s)' sẽ là một hàm tạo duy nhất. –

+0

@ 111111: Tuyệt vời! Bạn có thể vui lòng cho tôi một liên kết hoặc ví dụ? –

Trả lời

7

Trong C++ 11 trình biên dịch phù hợp (§12.9 trong tiêu chuẩn), bạn thực sự có thể làm được điều này khá dễ dàng:

struct Son : public Base { 
    using Base::Base; 
}; 

này kế thừa tất cả các nhà thầu từ Base và là equivalente mã của bạn cho lớp Son .

Thật không may, có vẻ như hầu hết các trình biên dịch phổ biến (chẳng hạn như GCC hoặc VC++) chưa hỗ trợ tính năng này, vì vậy bạn không may mắn trong thời gian này. Nhưng hãy thử mã này trong trình biên dịch của bạn và xem điều gì xảy ra.

+0

Có trình biên dịch thực sự đã thực hiện? –

+0

Các phiên bản mới nhất của ít nhất VStudio và GCC thực hiện nhiều tính năng C++ 11. Điều này có vẻ đơn giản để thực hiện, vì vậy tôi sẽ đặt cược họ làm, nhưng không thực sự biết chắc chắn. – Gorpik

+0

Hình như '(GCC) 4.7.0 20111203 (thử nghiệm)' không – Vikas

Các vấn đề liên quan