Bạn đúng ở điểm # 1. Chỉ định private
, protected
hoặc public
khi kế thừa từ một lớp cơ sở không thay đổi bất kỳ thứ gì truy cập khôn ngoan trên lớp dẫn xuất. Các specifier truy cập này cho trình biên dịch biết cách xử lý các thành viên lớp cơ sở khi các cá thể của lớp dẫn xuất được sử dụng ở đâu đó, hoặc nếu lớp dẫn xuất xảy ra được sử dụng làm lớp cơ sở cho các lớp khác.
UPDATE: Sau đây có thể giúp để minh họa sự khác biệt:
class Base
{
private: int base_pri;
protected: int base_pro;
public: int base_pub;
};
Đối với các lớp học có nguồn gốc từ cơ sở:
class With_Private_Base : private Base { void memberFn(); };
class With_Protected_Base : protected Base { void memberFn(); };
class With_Public_Base : public Base { void memberFn(); };
// this would be the same for all of the above 3 classes:
void With_PXXX_Base::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
Đối với các lớp học có nguồn gốc từ 3 các lớp thừa kế:
class A : public With_Private_Base { void memberFn(); }
void A::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // error: `int Base::base_pro' is protected
base_pub = 1; // error: `int Base::base_pub' is inaccessible
}
class B : public With_Protected_Base { void memberFn(); }
void B::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
class C : public With_Public_Base { void memberFn(); }
void C::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
Truy cập bên ngoài vào ba lớp học có nguồn gốc đầu tiên:
void main()
{
With_Private_Base pri_base;
pri_base.base_pri = 1; // error: `int Base::base_pri' is private
pri_base.base_pro = 1; // error: `int Base::base_pro' is protected
pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible
With_Protected_Base pro_base;
pro_base.base_pri = 1; // error: `int Base::base_pri' is private
pro_base.base_pro = 1; // error: `int Base::base_pro' is protected
pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible
With_Public_Base pub_base;
pub_base.base_pri = 1; // error: `int Base::base_pri' is private
pub_base.base_pro = 1; // error: `int Base::base_pro' is protected
pub_base.base_pub = 1; // OK
}
Nguồn
2010-01-28 18:41:18
Thừa kế thừa kế và thừa kế công khai giống nhau? –
@fahad: từ quan điểm của lớp dẫn xuất, có, chúng được. Từ một điểm truy cập bên ngoài của xem (khối cuối cùng của mã trong câu trả lời của tôi) họ là khá khác nhau. –