从 Base class 对象调用私有虚函数
Call private virtual functions from Base class object
我学习到虚函数最好是私有的,但是在我下面贴出的代码中,除非友情可以继承,函数call_inside()
应该是不能调用定义的虚函数的D1 class。所以我想知道它是如何工作的。
感谢您的回复。
#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;
}
call_inside
函数是 B
的好友。在 call_inside
中,您调用了 fun
两次,两次都是通过指向 B
实例的指针。 B
指针之一实际指向 D
这一事实并不重要,因为用于调用该函数的指针类型是 B
。如果您改为在 call_inside
中调用 trial1.fun()
,您将收到预期的编译错误,因为 fun
在 D
上是 private
并且您尝试调用它通过 D
个实例。
我学习到虚函数最好是私有的,但是在我下面贴出的代码中,除非友情可以继承,函数call_inside()
应该是不能调用定义的虚函数的D1 class。所以我想知道它是如何工作的。
感谢您的回复。
#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;
}
call_inside
函数是 B
的好友。在 call_inside
中,您调用了 fun
两次,两次都是通过指向 B
实例的指针。 B
指针之一实际指向 D
这一事实并不重要,因为用于调用该函数的指针类型是 B
。如果您改为在 call_inside
中调用 trial1.fun()
,您将收到预期的编译错误,因为 fun
在 D
上是 private
并且您尝试调用它通过 D
个实例。