1, 关于派生类访问基类私有成员的问题
基类private的成员是不能够在派生类中被访问到的。你可以这样解决:一种方法是把基类中你想在派生类访问的改成protected访问权限。比如:class yuan{protected:double r; };现在你可以在派生类访问r了。另一种方法是在基类中添加一个成员函数来获取这个成员变量的值。class yuan{double r; public:double GetValueR(){return r;}};现在你可以在派生类调用GetValueR来获取R值。但是注意GetValueR()这个函数的访问权限必须是public或者protected,如果它本身也是private那么就跟r一样,在派生类是无法访问的了。
2, 派生类到基类转换的可访问性
先声明一下,个人意见而已。其实语言的实现在CPU来说是没有能力区别的,CPU只是知道 地址,二进制 等等。而一切语言的特性是人为规定的,而且是由编译器来限制的,并不是说是因为CPU或电路板上就规定了。所以说,你要严格去遵循语言标准,并同时参考编译器的特性。对于你说的这个,C++里面叫多态,多态的性质就是规定了在编译时不去进行判断类的具体情况,也就是不去硬编码,而是在运行时决定是基类还是派生类,到时候才会决定调用哪一个的方法。所以,你传给函数myfun()的参数肯定是在运行时具体确定是哪一个类,如果这样的话,那么你传的是子类,它就会调用子类的方法。至于你说子类的方法是私有的,那就是编译器的实现问题了,我估计它是没有检验子类的重写函数的私有性质,只是返回值、名称、参数一致就通过了。但是它肯定检测基类的了,不信你试试将基类的虚函数写成私有的,肯定运行报错。所以我只能告诉你,这就是语言的标准和编译器的实现问题,否则你说是遵循多态的定义标准好呢还是遵循私有性好呢?这在编译器实现时是个困难的抉择吧!
相关概念
多态
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。