我理解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的虚拟答案函数。
答案 0 :(得分:3)
您这里没有访问Child::Answer
而Parent::Answer
,这没关系,因为Parent
是您的朋友。这是一个Child
对象的事实并不重要。但是,在运行时实际调用哪种方法很重要。由于Parent::Answer
为virtual
,因此使用Child::Answer
覆盖它意味着不知道Child
是什么的来电者,即使Child::Answer
仍然会调用Child
1}}通过Parent
引用或指针访问(有一层间接在运行时解析相应的函数)。
你甚至可以在实现Child
之前编译它,然后链接到这个.o
文件,交给Child
实例,伪装成Parent&
或{{1 }}。 Parent*
永远不会有机会甚至知道有一些名为Person
的东西,但仍然能够“找到”正确的实现。这就是动态绑定的力量。