người bạn của tôi đã cho tôi thấy đoạn code sau"sử dụng" với tên lớp cơ sở để thay đổi quyền truy cập hợp lệ?
struct A {
virtual void f() = 0;
virtual void g() = 0;
};
struct AInternal : A {
virtual void f() { /* ... */ }
virtual void g() { /* ... */ }
};
Ông đang sử dụng AInternal
như một lớp học nội mà thực hiện hầu hết (nếu không phải tất cả A
). Sau đó, ông được kế thừa từ AInternal
, nhưng khi ông muốn rằng AInternal
vẫn không truy cập được (vì nó là một chi tiết triển khai), ông kế thừa bảo vệ (được thực hiện theo điều khoản). Những gì ông cũng đã làm là using
ing tên lớp cơ sở để làm A
truy cập (nó đã được bảo vệ theo mặc định, vì AInternal
được thừa kế bảo vệ quá)
struct C : protected AInternal {
using AInternal::A;
};
Trên thực tế, điều này đã làm việc tốt (nhưng như sau chúng tôi thấy, nó vẫn giữ các chức năng thành viên private
- chỉ là lớp cơ sở đã được thực hiện public
), nhưng nó chỉ hoạt động trên GCC. Không thể truy cập cơ sở A
. Bất kỳ ý tưởng? Chúng tôi thậm chí có thể làm cho nó để phá vỡ mã hoạt động trên Clang
struct C : public AInternal {
protected:
using AInternal::A;
};
C *c = 0;
A *a = c; // error on GCC!
Ai đó có thể giúp đỡ xin vui lòng?
Nếu tôi hiểu đúng thì A xác định Giao diện sẽ được cung cấp bởi C. Điều tôi thực sự không nhận được là ý tưởng đằng sau toàn bộ quá trình thiết lập. Nó làm cho các phương thức công khai trong 'AInternal' không thể truy cập nếu không có trong 'A' nhưng người ta chỉ có thể có các phương thức riêng như vậy trong' AInternal' và kế thừa công khai trong C. – Pixelchemist
@Pixelchemist ý tưởng là làm cho 'sử dụng AInternal :: A' làm cho các thành viên lại hoạt động công khai. Điều đó không có tác dụng, nhưng những gì nó đã làm là làm cho lớp cơ sở 'A' có thể truy cập được. –
Vâng, nhưng tôi không hiểu lý do cho loại bố cục này. Tại sao không có phương thức giao diện công khai trong 'AInternal', sử dụng thừa kế công khai và được sử dụng tốt? "Chi tiết triển khai" như chức năng trợ giúp hoặc các thành viên khác vẫn có thể được giữ riêng tư trong 'AInternal'. – Pixelchemist