【发布时间】:2015-11-04 09:40:58
【问题描述】:
我了解到最好将虚函数保持私有,但是在我下面发布的代码中,除非友谊可以继承,否则函数call_inside()应该无法调用D1类中定义的虚函数。所以我想知道它是如何工作的。
感谢您的回复。
#include<iostream>
struct B
{
friend void call_inside();
private:
virtual void fun() {std::cout<<"virtual_B"<<std::endl;}
};
struct D1:public B
{
private:
void fun()override {std::cout<<"virtual_D1"<<std::endl;}
};
void call_inside()
{
B trial; D1 trial1;
B *p=&trial, *p1=&trial1;
p->fun();
p1->fun();
}
int main()
{
call_inside();
return 0;
}
【问题讨论】:
-
我自己有一个解释:我在它的友元函数中调用了 B 的私有成员,因此它在编译时是完全合法的。调用哪个版本的虚函数是在运行时确定的,此时 D1 的私有说明符无关紧要。不知道有没有道理
-
如果你想增加令人头疼的功能,请删除
friend声明,仅在B中公开fun(),然后尝试p1->fun()和trial1.fun();)