被友元的虚函数,是可以被继承的
三个类Myclass,Myclass2,son,Myclass对Myclass2的set函数友元,son继承Myclass2,如果son不重写set函数,而是直接继承Myclass2的set,是可以操作Myclass私有属性的。
#include <iostream>
using namespace std;
class MyClass;
class MyClass2
{
public:
virtual int set(MyClass &m);//虚函数
MyClass2();
~MyClass2();
};
MyClass2::MyClass2()
{
}
MyClass2::~MyClass2()
{
}
class MyClass
{
public:
friend int MyClass2::set(MyClass &m);
MyClass();
~MyClass();
private:
int a = 999;
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
int MyClass2::set(MyClass &m){
cout << m.a << endl;
return 0;
};
class son:public MyClass2
{
public:
//int set(MyClass &m){
// cout << m.a << endl;
// return 0;
//}
son();
~son();
private:
};
son::son()
{
}
son::~son()
{
}
int main(){
MyClass m1;
MyClass2 m2;
son s;
m2.set(m1);
s.set(m1);
getchar();
return 0;
}
上面代码输出:
debug打断点查看虚函数表,sun里面存储的是Myclass2的set,是可以调用的,前提不重写
普通友元函数不能定义为虚函数,因为不是成员函数,即使继承也不会继承非成员函数,所以就不存在多态,定义成虚函数就没意义了
#include <iostream>
using namespace std;
class A
{
public:
friend void set_show(int x, A &a){ //不允许定义为虚函数,编译错误
a.data = x;
cout << a.data << endl;
};
private:
int data;
};
int main(void)
{
class A a;
set_show(1, a);
getchar();
return 0;
}