先来看一个代码:
#include <iostream>
using namespace std;
class base
{
public:
virtual void fun()
{
cout<<"base"<<endl;
}
};
class son:public base
{
public:
void fun()
{
cout<<"son"<<endl;
}
};
void dis(base &s)
{
s.fun();
}
int main()
{
base a;
dis(a);
son s ;
dis(s);
return 0;
}
输出:base son 没有问题
若一下代码:
#include <iostream>
using namespace std;
class base
{
public:
virtual void fun()
{
cout<<"base"<<endl;
}
};
class son:public base
{
private: //改动
void fun()
{
cout<<"son"<<endl;
}
};
void dis(base &s)
{
s.fun();
}
int main()
{
base a;
dis(a);
son s ;
dis(s);
return 0;
}
虚函数在子类,声明为private,但结果仍然如上,也没有编译错误。
再来一个:
#include <iostream>
using namespace std;
class base
{
public:
virtual void fun()
{
cout<<"base"<<endl;
}
};
class son:private base //这里改的
{
public: //注意是public
void fun()
{
cout<<"son"<<endl;
}
};
void dis(base &s)
{
s.fun();
}
int main()
{
base a;
dis(a);
son s ;
dis(s);
return 0;
}
编译出错,main.cpp:29:10: error: 'base' is an inaccessible base of 'son'
由此可知,派生类虚函数的可访问性与继承的方式和虚函数在基类的声明方式有关(public,或private)与派生类声明的方式无关(如public继承,但声明为private,但仍可访问)