可能重复:
What are access specifiers? Should I inherit with private, protected or public?
如何在C ++中创建一个派生类,它保留了属性和方法的访问说明符,如下所示:
class Base
{
private:
void base_private();
protected:
void base_protected();
public:
void base_public();
};
class A: [what type is appropriate here?] Base
{
public:
void test() {
base_protected(); // Ok
}
};
class B: [what type is appropriate here?] A
{
public:
void test() {
base_protected(); // Ok
}
};
int main()
{
A a;
B b;
a.base_public(); // Ok
a.base_protected(); // Not Ok
b.base_protected(); // Not Ok
b.test(); // Ok
return 0;
}
我的意思是base_protected()
方法仍然在派生类中受到保护,但base_public()
是公开的。
答案 0 :(得分:2)
让我们考虑Base
成员的可用性:
base_private
不适用于客户,但可供Base
本身base_protected
不适用于客户,但可供Base
本身base_public
可供客户和Base
现在,如果您有class A : public Base
(公共继承),Base
成员的可用性将为:
base_private
无法供客户使用不可用至A
本身base_protected
不适用于客户,但可供A
本身base_public
可供客户和A
现在,您要问的是如何为这两个类Base
和A
保留相同的客户端界面。如果您在上面的列表中查看客户成员的可用性,您会发现Base
和A
的成员完全相同:base_private
不可用; base_protected
不可用;并且base_public
可用。
Base
和A
之间唯一发生变化的是A
无法访问Base
私有的成员。这就是protected
访问控制的重点 - 它为派生类提供了对其基类成员的访问权限,而不会将它们提供给客户端。
所以public
继承是你需要的。
答案 1 :(得分:0)
无论您是继承public
,protected
还是private
,派生类都可以访问基类的protected
和public
成员。
当您继承private
时,基类的所有成员都被视为private
的派生类A
。类似于protected
继承,A
的派生类可以访问protected
的{{1}}和public
成员。
在这两种情况下,Base
和private
继承,“公共”无法访问protected
的成员。
现在回答你的问题,使用Base
继承来保留基类的访问说明符。