class Base
{
private: int base_pri;
protected: int base_pro;
public: int base_pub;
};
对于从base派生的类:
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
}
对于从3个派生类派生的类:
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
}
对前三个派生类的外部访问:
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
}
5 回答
你在第一点是正确的 . 从基类继承时指定
private
,protected
或public
不会在派生类本身上以任何访问方式更改任何内容 . 这些访问说明符告诉编译器在其他地方使用派生类的实例时如何处理基类成员,或者派生类恰好用作其他类的基类 .UPDATE: 以下内容可能有助于说明差异:
对于从base派生的类:
对于从3个派生类派生的类:
对前三个派生类的外部访问:
1a)受保护的继承意味着“子”可以访问公共继承中的所有内容,但使用该对象的其他人只能看到子对象的公共接口,隐藏其父级中的任何内容 .
1b)私有继承导致类的所有公共函数作为私有函数继承 - 这意味着它们不能从子进程调用或从对象的客户端访问 .
2)私有成员是继承的,因为基类中的方法可能需要它们来操作 .
是的,这是正确的 . 派生类可以访问其基类的受保护和公共成员,派生类无法访问其基类的私有成员 .
私有成员是由于以下原因而继承的:基类可以定义修改基类的私有成员的受保护或公共函数 . 派生类可以调用此函数,因此需要知道它正在访问的私有变量 .
是 .
是 .
因为它们是基类的一部分,所以您需要基类,它是派生类的一部分 . 注意,您仍然可以使用非重写
public
/protected
成员函数来操作基类中维护的某些状态(如果有) .1)你是对的 . 没有任何类型的继承允许访问私有成员(只有
friend
声明允许)2)它们是“继承的”,因为Derived类型的对象在存储在内存中时,包括Derived和Base的所有数据成员,包括Base的私有成员 . 私有成员不能随便离开,因为当Base的方法运行在该对象上时,他们将需要访问Base的私有成员 .
此外,Base的私有成员的名称在技术上属于Derived方法的范围,但是如果您尝试访问它们,当然会遇到编译错误 .