#include <iostream> class Shape{ public: virtual void show(int a = 12 ){ std::cout << "Shape a:" << a << std::endl; } }; class Rectangle:public Shape{ private: virtual void show(int a){ std::cout << "Rectangle a:" << a << std::endl; } }; int main(){ Shape *ptr = new Rectangle; ptr->show(); }
解决方案
20
这是复写(override)父类虚方法是需要注意的一个问题,一般建议和父类同方法的权限一致。
不一致的话,以调用者做为基准,例如这ptr是一个Shape*类型的,在使用
不一致的话,以调用者做为基准,例如这ptr是一个Shape*类型的,在使用
ptr->show();
就认为ptr是一个Shape类型,毕竟权限检查是在编译期间确定,而虚方法是在运行时才起作用
20
这是OO设计的原则。派生类中继承自基类的函数,不能比基类中对应的那个函数具有更严格的访问级别。也就是说,假如show在基类中声明为public的,那么在派生类中也必须是public的。
这一点在Java语言中是强制性的,假如写相似上面的代码则编译都不会通过。
派生类中虚函数的访问权限是在编译阶段由基类确定的,在运行阶段不再检查访问权限,所以,虚函数的访问权限与派生类就没关系了。
可访问性是静态解析的,不是动态解析的。即是说,无论最终覆盖者的可访问性怎么样,可访问性均取决于函数调用后缀表达式的可访问性。
这一点在Java语言中是强制性的,假如写相似上面的代码则编译都不会通过。
派生类中虚函数的访问权限是在编译阶段由基类确定的,在运行阶段不再检查访问权限,所以,虚函数的访问权限与派生类就没关系了。
可访问性是静态解析的,不是动态解析的。即是说,无论最终覆盖者的可访问性怎么样,可访问性均取决于函数调用后缀表达式的可访问性。
10
++
重载的时候,修改访问权限是徒增烦恼,作用不大,反而把代码弄得很诡异,一般来说很没有必要