c ++朋友继承

时间:2012-04-18 17:47:55

标签: c++ inheritance virtual friend

我理解friend不是继承的。我有课程Parent Person Child。父母和人是彼此的朋友。 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!,并且在尝试访问虚拟函数时不会抛出运行时错误?

我对如何实现子函数感到困惑,并且该程序在运行时没有错误,因为我预计它会尝试调用Parent的虚拟答案函数。

1 个答案:

答案 0 :(得分:3)

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

你甚至可以在实现Child之前编译它,然后链接到这个.o文件,交给Child实例,伪装成Parent&或{{1 }}。 Parent*永远不会有机会甚至知道有一些名为Person的东西,但仍然能够“找到”正确的实现。这就是动态绑定的力量。