子类继承父类,同名成员函数在父类中是public公共属性,但是在子类中是private私有属性。

父类: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行这种定义变量的格式叫基类指针指向子类虚函数,如果你的子类没有覆盖基类的虚函数,那么调用的还是基类的虚函数。这种用法是实现类、函数的多态性!关于多态的用法可以多看看实体书关于多态的那一节

谢谢,我对于多态那边还是有点疑问。因为子类把成员方法设置为私有,自然不想被外部函数调用。但是通过继承了基类的这种方式,外部函数里就可以调用子类的私有成员方法了,感觉有点疑惑。

怎么说呢,这只是特例,就是为了让使用者看不到你具体类的函数是怎么写的,举个例子,你的基类是鸟类,你的子类是布谷鸟,通过基类调用子类函数就可以实现对子类的封装了,你改变基类的函数体不会对这个调用产生影响了