c++ - 通过在基类中对其进行虚拟调用来访问派生类中的函数

标签 c++ virtual handle protected friend-class

在阅读 accelerated c++ 的第 13 章时,我想到了这个问题。

这道题涉及三个类,e.g. Core 类、Grade 类和 Student_Info 类。 Core 是基类。 Grade是继承自Core的派生类。 Student_info 是句柄类。

为了给Student_info定义复制构造函数,我们需要在类Core中有一个虚clone函数,我们还需要在类中重新定义它类 等级。这两个函数都在 protected 标签下。要访问Core 的 protected clone 函数,句柄类Student_Info 必须指定为Core 的友元类。

然而,它说我们不需要将 Student_Info 指定为 Grade 的 friend 来访问它的克隆函数,因为我们只能通过虚拟调用来访问它核心::克隆。我真的很困惑。我不知道Student_Info如何访问Gradeclone函数。如果 cp(Core* 类型)指向类 Grade 的对象,为什么 s.cp->clone() 可以工作?有人可以给我详细说明吗?

相关部分代码:

class Core {     
    friend class Student_info; 
protected:     
    virtual Core* clone() const { return new Core(*this); } 
 };

class Grad {
protected:
    Grad* clone() const { return new Grad(*this); }     
};

Student_info& Student_info::operator=(const Student_info& s) {
    if (&s != this){         
        delete cp;// cp is of type Core*
            if (s.cp)             
                cp = s.cp->clone();
            else             
                cp = 0;     
    }     
    return *this; 
}

最佳答案

Student_infoCore 的友元,因此它能够访问Core::clone()。这就是 s.cp->clone() 起作用的原因。动态调度调用的位置是内部的且无关紧要。

无法先验(静态)知道调用被动态分派(dispatch)到哪个方法。编译器不知道它,更不用说检查它的访问修饰符了。

关于c++ - 通过在基类中对其进行虚拟调用来访问派生类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49808541/

相关文章:

android - 如何检测用户在一段时间内没有 Activity 并在android中进行多项 Activity

ios - 从 iOS 中的 Twitter 框架获取 Twitter 句柄

c++ - 按级别缩进的 pretty-print C++ 容器

c++ - 使用 Boost.Locale 库检索代码点

c++ - 对 `vtable for DigitalClock' 的 undefined reference - 对 `DigitalClock::staticMetaObject' 的 undefined reference - Qt

keyboard - 如何在没有表单标签的情况下更改 Mobile Safari 键盘中的返回键文本?

C++ 14忽略接口(interface)getter中的返回类型但在实现中指定它

c++ - 我可以将一个对象类转换为它在其中实现的接口(interface)指针吗?

c++ - 删除对象列表中的相似项目

c++ - 检测到任何使用 OpenProcess 的程序?