0

我知道这friend不是继承的。我有课Parent Person Child。Parent 和 Person 是彼此的朋友。父母具有以下保护功能...

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 person;
Child child;
person.parent->Answer();

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

我对如何实现孩子的功能感到困惑,并且程序在运行时没有出错,因为我预计它正在尝试调用父母的虚拟应答功能。

4

1 回答 1

3

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

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

于 2012-04-18T18:05:23.813 回答