【问题标题】:c++ friend inheritancec++朋友继承
【发布时间】:2012-04-18 17:47:55
【问题描述】:

我知道friend 不是继承的。我有课程Parent Person Child。 Parent 和 Person 是彼此的朋友。 Parent 具有以下 PROTECTED 功能...

class Person
{
    friend class Parent;
    public:
        Parent * parent;
}

class Parent
{
    friend class Person;
    protected:
        virtual void Answer() = 0;
}

class Child : public Parent
{
    void Answer()
    {
        std::cout << "Child!" << endl;
    }
}

我的问题是,如果没有继承友谊,我怎么能拥有以下...? (Person 有一个指向 Parent 的指针)

Person person;
Child child;
person.parent->Answer();

为什么是这个 Child! 的输出,并且在尝试访问虚函数时没有抛出运行时错误?

我对子函数的实现方式感到困惑,并且程序在运行时没有出错,因为我预计它正在尝试调用父函数的虚拟应答函数。

【问题讨论】:

  • 你这里有继承吗?即 class Child: public Parent 在您的子类定义中?
  • 你没有在Child 上调用任何函数,正如我在 Q 中看到的那样。
  • 与其描述你的代码,不如发布一个琐碎(但完整)的代码sn-p。这样,我们在回答时都可以清楚您的继承/友谊关系是什么。
  • @Als 所以因为我从 Parent 类型调用 Answer,可以吗?即使它是虚拟的并且由 Child 类型实现?
  • 你需要展示你想弄清楚的代码,然后我们可以很容易地解释它。没有,我们就迷路了。编辑您的问题以包含小而相关的示例。

标签: c++ inheritance virtual friend


【解决方案1】:

您访问的不是Child::Answer,而是Parent::Answer,这没关系,因为Parent 是您的朋友。这是一个Child 对象这一事实并不重要。但是,在运行时实际调用什么方法很重要。因为Parent::Answervirtual,所以用Child::Answer 覆盖它意味着不知道Child 是什么的调用者仍然会调用Child::Answer,即使通过Child 引用访问Child 或指针(有一个间接层在运行时解析适当的函数)。

你甚至可以在实现Child 之前编译它,然后链接到这个.o 文件,给它一个Child 实例,伪装成Parent&amp;Parent*Person 将永远没有机会知道有一个叫做 Child 的东西,但仍然能够“找到”正确的实现。这就是动态绑定的强大之处。

【讨论】:

  • 什么子对象??调用的是 Person 的 Parent 对象。
  • @juanchopanza:是的,我在OP添加三个类的声明+实现之前回答了。该问题专门询问如何从Person 上下文中调用Child::Answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2011-04-23
  • 2015-10-12
  • 2014-01-09
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多