2011-01-12 36 views
9

Tôi đang sử dụng quyền thừa kế riêng trong một dự án, trong phần "được triển khai dưới dạng" -sense. Lớp cơ sở định nghĩa toán tử [], và đây là chức năng tôi muốn sử dụng. Do đó, tôi cóThừa kế riêng sử dụng chỉ thị, quá tải?

class A : private B { 
    using B::operator[]; 
    // ... 
}; 

Tuy nhiên, làm cách nào để kiểm soát phiên bản của toán tử [] tôi nhận được? Trong thực tế, tôi cần nhiều hơn một phiên bản const và không phải const. Điều này có thể được thực hiện?

+3

Trong trường hợp này, bạn có thể sử dụng bố cục để cung cấp cho bạn kết quả mong muốn thay vì thừa kế riêng. – James

+1

Vâng, tôi biết ... Tôi đã thay đổi nó thành quyền thừa kế riêng thay vì giảm số lượng mã chuyển tiếp. Vì vậy, nó không phải là có thể? Chức năng được chọn như thế nào? – carlpett

+0

Mã của bạn sẽ dễ dàng hơn để viết và duy trì nếu bạn sử dụng bố cục thay vì thừa kế riêng ở đây. Quy tắc chung là không sử dụng các tính năng ngoài tường của C++ khi chúng không hoàn toàn cần thiết (từ những gì bạn đã nói cho đến nay, không cần phải thừa kế riêng trong trường hợp này). –

Trả lời

6

Hiểu biết của tôi là using của bạn sẽ tự động mang tất cả các tình trạng quá tải khác nhau của nhà điều hành. Có quá tải nào đó mà bạn muốn loại trừ khỏi việc được đưa vào lớp trẻ em không? Trong trường hợp đó, tốt hơn nên chia công việc thành nhiều hàm có tên khác nhau trong bố mẹ và chỉ using những thứ bạn cần.

+0

Tôi cũng đã nghĩ như vậy, nhưng tôi nhận được các lỗi biên dịch từ việc loại bỏ const, mặc dù có các phiên bản trả về cả 'T &' và 'const T &' (mẫu tên T) – carlpett

+0

Vì vậy, đây là một trong số đó "lần ... Sau khi nhìn lên và xuống mã và biên dịch lại, nó đột nhiên hoạt động, và tôi không thể cho cuộc sống của tôi hiểu những gì tôi đã thay đổi. Điều gì đã thay đổi mặc dù là tôi đã học được nhiều hơn một chút về thừa kế, vì vậy cảm ơn! – carlpett

2

này không như mong đợi:

class A 
{ 
public: 
    int operator[](int idx) { return 0; } 
    int operator[](int idx) const { return 1; } 
}; 

class B : public A 
{ 
public: 
    using A::operator[]; 

    void opa() { cout << operator[](1) << endl; } 
    void opb() const { cout << operator[](1) << endl; } 
}; 

int main(void) 
{ 
    B b; 
    b.opa(); 
    b.opb(); 

    const B d = B(); 
    cout << d[1] << endl; // should trigger the const version of operator[] 
    return 0; 
} 

Nói cách khác, const thích hợp/phiên bản const không được tiêm vào B. LƯU Ý: Nếu phiên bản const không được cung cấp, sau đó bạn sẽ nhận được một lỗi trình biên dịch (điều này làm việc cho dù thừa kế là riêng tư hoặc công cộng).

+0

Cảm ơn, ví dụ tốt! – carlpett

+0

Tôi cũng sẽ thêm 'b [2];' hoặc tương tự như 'main' để chỉ ra rằng các hàm toán tử có thể được sử dụng trực tiếp từ bên ngoài' lớp B'. – aschepler

+0

@aschepler, điểm tốt, sẽ cập nhật ... – Nim

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