得空看一下 2021-01-03 10:38 采纳率: 33.3%
浏览 139
已采纳

子类继承父类,同名成员函数在父类中是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");
}
  • 写回答

3条回答 默认 最新

  • 小白小白你好菜 2021-01-03 14:36
    关注

    在一个类中,如果你不声明成员的范围,默认为private,所以你在20行的s.print()会报错,在类外是不能调用类的私有成员变量或者私有成员函数。

    22行是强调了基类的虚函数输出,输出内容是Base print

    25行也是因为是私有成员函数,所以运行会出现‘virtual void Son::print()' is private的错误

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?