2013-05-04 27 views
5

Tôi muốn các thành viên được kế thừa riêng tư. Tôi nghĩ rằng tôi đã nhìn thấy một ví dụ về làm cho họ công khai tuy nhiên thực tế này được bắt nguồn với từ khóa riêng. Câu hỏi của tôi: làm thế nào để làm điều đó, và nếu nó có thể thì không nên nó bị cấm?là điều này có thể thừa hưởng lớp riêng tư nhưng làm cho các thành viên được công khai?

class U{ 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 

class V : private U{ 
public: 
    int i; 
    //can make a public again? 
}; 

Trả lời

5

làm thế nào để làm điều đó?

hoàn toàn có thể, sử dụng từ khóa using.

không nên bị cấm?

Không cần. Bạn luôn có thể trả lại thành viên lại khả năng truy cập của họ nhưng không nhiều hơn ban đầu là. Vì vậy, nếu lớp cơ sở ban đầu đã tuyên bố một cái gì đó là công khai và nó chỉ là ý tưởng/hạn chế của bạn để làm cho nó riêng tư, điều này không làm tổn thương lớp cơ sở nếu bạn bỏ hạn chế này và để nó ở chế độ công khai. sự bắt đầu. Trích dẫn từ "Ngôn ngữ lập trình C++" sẽ giúp ích nhất ở đây.

Một sử dụng kê khai không thể được sử dụng để truy cập vào thêm thông tin . Nó chỉ đơn giản là một mecha- nism cho làm cho truy cập thông tin thuận tiện hơn để sử dụng.

vì vậy nếu nó đã truy cập trong lớp cơ sở, và bạn có nguồn gốc lớp học của bạn với protected hoặc private từ khóa mà bạn có thể loại bỏ hạn chế này và gửi lại chúng trở lại mức ban đầu của họ tiếp cận bằng cách "vận chuyển" họ một phần thích hợp (public,protected,private) trong định nghĩa lớp dẫn xuất của bạn.

class U{ 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 

class V : private U{ 
public: 
    using U::b; 
    using U::a; 
}; 

int main(int argc, char** argv) { 

    V v; 
    printf("\nV: %d %d %d",v.a,v.a,v.b); 

    U u; 
    printf("\nU: %d %d %d",u.a,u.a,u.a); 

    return 0; 
} 
+3

Không đúng sự thật. OP hỏi về các thành viên * private * data. –

+0

OP hỏi về 'U :: c', là riêng tư trong' U'. – juanchopanza

+1

@AndyProwl không tôi có nghĩa là một khóa học –

6

Bạn không thể làm cho c công cộng vì nó là tin tới U và không thể truy cập từ V (bên cạnh đó, một thiết kế sẽ đòi hỏi đó có lẽ là sai lầm, vì nó sẽ vi phạm đóng gói - một lớp học nên không biết/quan tâm đến private thành viên của các lớp khác).

Tuy nhiên, điều này cũng không thực sự của protectedpublic thành viên, có trình độ truy cập có thể được ghi đè bởi các lớp thừa kế thông qua một tuyên bố using. Ví dụ:

class V : private U{ 
public: 
    int i; 

    using U::a; 
// ^^^^^^^^^^^ Gives "a" public accessibility 

    using U::b; 
// ^^^^^^^^^^^ Gives "b" public accessibility 

    // using U::c; // ERROR! c is not accessible from V 

}; 

Trên đây sẽ làm cho b thể truy cập từ mã khách hàng bên ngoài để VU:

int main() 
{ 
    V v; 
    v.a = 42; // OK 
    v.b = 1729; // OK 
} 
+0

xin lỗi, tôi có nghĩa là một, tất nhiên, c là không được công khai –

+0

@authority: Oh, OK rồi. Vâng, câu trả lời vẫn hợp lệ :) –

3

Bạn không thể làm cho U::c công cộng, bởi vì nó là private-U, vì vậy nó không thể được truy cập từ V. Nếu đó là public hoặc protected, thì bạn có thể, với tuyên bố using.Vì vậy, bạn có thể làm cho U::aU::b công cộng, nhưng không U::c:

class V : private U{ 
public: 
    int i; 
    //can make c public again? 
    using U::c; // ERROR: only if U::c is public or protected in U 
    using U::a; // OK 
    using U::b; // OK 
}; 
+0

cảm ơn bạn rất nhiều –

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