在阅读 accelerated c ++ 的第13章时,我想到了这个问题。
这个问题涉及三个类,例如课程Core
,课程Grade
和课程Student_Info
。 Core
是基类。 Grade
是从Core
继承的派生类。 Student_info
是句柄类。
为了定义Student_info
的复制构造函数,我们需要在类clone
中使用虚拟Core
函数,我们还需要在类Grade
中重新定义它。这两个函数都在protected
标签下。要访问clone
的受保护Core
函数,必须将句柄类Student_Info
指定为Core
的朋友类。
但是,它表示我们不需要指定Student_Info
作为Grade
的朋友来访问其克隆功能,因为我们只能通过对Core::clone
的虚拟调用来访问它。我真的很困惑。我不知道Student_Info
如何访问Grade
的{{1}}功能。如果cp(类型clone
)指向类Core*
的对象,为什么Grade
可以工作?有些人可以详细说明一下吗?
代码的相关部分:
s.cp->clone()
答案 0 :(得分:1)
Student_info
是Core
的朋友,因此可以访问Core::clone()
。这就是s.cp->clone()
有效的原因。动态调度的调用是内部的,不相关的。
动态调度调用的方法不能先验地(静态地)知道。编译器不知道它,更不用说检查它的访问修饰符了。
答案 1 :(得分:0)
私人保护和公共保护命名事物的方式,而不是事物本身。
您正在命名基类克隆;您只需要通过该名称访问它的权限。事实上它实际上是别的东西是不相关的。