2012-06-07 38 views
5

Bạn có thể đảm bảo tôi, nếu tất cả các chỉ định truy cập (bao gồm cả thừa kế) trong structpublic?cấu trúc và lớp và kế thừa (C++)

Nói cách khác: là những thứ như nhau?

class C: public B, public A { public: 
    C():A(1),B(2){} 
    //... 
}; 

struct C: B, A { 
    C():A(1),B(2){} 
    //... 
}; 
+0

Bạn có thể tự mình thử nghiệm bằng một chương trình rất nhỏ. – Nobody

+3

Kiểm tra chủ đề này về sự khác biệt giữa các lớp và cấu trúc trong C++ http://stackoverflow.com/questions/92859/what-are-the-differences-between-struct-and-class-in-c –

+2

@Nobody: Nhưng sau đó anh ta dựa vào trình biên dịch của mình không có lỗi :) –

Trả lời

2

Từ C++ standard, 11.2.2, trang 208:

Trong sự vắng mặt của một er fi truy cập đặc hiệu cho một lớp cơ sở, công chúng được giả định khi lớp có nguồn gốc được khai báo struct và tư nhân được giả định khi lớp được khai báo lớp.

Vì vậy, đúng: khi lớp dẫn xuất là struct, nó thừa hưởng các lớp khác là public trừ khi bạn chỉ định khác.

7

Vâng, tất cả họ đều được công khai.

struct A : B { 
    C c; 
    void foo() const {} 
} 

tương đương với

struct A : public B { 
public: 
    C c; 
    void foo() const {} 
} 

Đối với thành viên, nó được quy định tại §11:

thành viên của một lớp định nghĩa với từ khoá class là tin theo mặc định. Các thành viên của một lớp được định nghĩa với các từ khóa struct hoặc union được công khai theo mặc định.

và cho cho các lớp cơ sở trong §11.2:

Trong sự vắng mặt của một access-specifier cho một lớp cơ sở, công chúng được giả định khi lớp có nguồn gốc được định nghĩa với đẳng cấp chìa khóa struct và private được giả định khi lớp được định nghĩa với lớp class-key.

nơi tham chiếu đến tiêu chuẩn C++ 11.

2

Từ Accessibility C++ 11 Chuẩn (N3242 draft)

11,2 của các lớp cơ sở và các thành viên lớp cơ sở

2 Trong sự vắng mặt của một access-specifier cho một lớp cơ sở, cộng đồng là giả định khi lớp dẫn xuất được định nghĩa với lớp-class struct và private được giả định khi lớp được định nghĩa với lớp khóa lớp.