Code Bye

c++继承的一个疑惑

#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();
}

子类中,show是private的,但继承之后,可以用ptr直接调用,莫非继承能改变访问权限

解决方案

20

这是复写(override)父类虚方法是需要注意的一个问题,一般建议和父类同方法的权限一致。
不一致的话,以调用者做为基准,例如这ptr是一个Shape*类型的,在使用
 ptr->show();

就认为ptr是一个Shape类型,毕竟权限检查是在编译期间确定,而虚方法是在运行时才起作用

20

这是OO设计的原则。派生类中继承自基类的函数,不能比基类中对应的那个函数具有更严格的访问级别。也就是说,假如show在基类中声明为public的,那么在派生类中也必须是public的。
这一点在Java语言中是强制性的,假如写相似上面的代码则编译都不会通过。
派生类中虚函数访问权限是在编译阶段由基类确定的,在运行阶段不再检查访问权限,所以,虚函数的访问权限与派生类就没关系了。
可访问性是静态解析的,不是动态解析的。即是说,无论最终覆盖者的可访问性怎么样,可访问性均取决于函数调用后缀表达式的可访问性。

10

引用:

这是OO设计的原则。派生类中继承自基类的函数,不能比基类中对应的那个函数具有更严格的访问级别。也就是说,假如show在基类中声明为public的,那么在派生类中也必须是public的。
这一点在Java语言中是强制性的,假如写相似上面的代码则编译都不会通过。
派生类中虚函数访问权限是在编译阶段由基类确定的,在运行阶段不再检查访问权限,所以,虚函数的访问权限与派生类就没关系了。
可访问性是静态解析的,不是动态解析的。即是说,无论最终覆盖者的可访问性怎么样,可访问性均取决于函数调用后缀表达式的可访问性。

++
重载的时候,修改访问权限是徒增烦恼,作用不大,反而把代码弄得很诡异,一般来说很没有必要


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c++继承的一个疑惑