父类:public: virtual void print() 虚函数
子类:private:void print() 私有成员函数
那么为什么通过Base *s2=new Son; s2->print(); 可以调用子类的私有成员函数?
#include<iostream>
using namespace std;
#include<string>
//父类
class Base{
public:
virtual void print(){
cout<<"Base print"<<endl;
}
};
//子类
class Son:public Base{
void print(){
cout<<"Son print"<<endl;
}
};
void test01(){
Son s;
//s.print();//报错,成员方法已经覆盖了
s.Base::print();
Son *s1=new Son;
//s1->print();//报错,
Base *s2=new Son;
s2->print();
}
void main(){
test01();
system("pause");
}
在一个类中,如果你不声明成员的范围,默认为private,所以你在20行的s.print()会报错,在类外是不能调用类的私有成员变量或者私有成员函数。
22行是强调了基类的虚函数输出,输出内容是Base print
25行也是因为是私有成员函数,所以运行会出现‘virtual void Son::print()' is private的错误
27行这种定义变量的格式叫基类指针指向子类虚函数,如果你的子类没有覆盖基类的虚函数,那么调用的还是基类的虚函数。这种用法是实现类、函数的多态性!关于多态的用法可以多看看实体书关于多态的那一节
谢谢,我对于多态那边还是有点疑问。因为子类把成员方法设置为私有,自然不想被外部函数调用。但是通过继承了基类的这种方式,外部函数里就可以调用子类的私有成员方法了,感觉有点疑惑。
怎么说呢,这只是特例,就是为了让使用者看不到你具体类的函数是怎么写的,举个例子,你的基类是鸟类,你的子类是布谷鸟,通过基类调用子类函数就可以实现对子类的封装了,你改变基类的函数体不会对这个调用产生影响了