• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Java/C++之public、protected、private;virtual&abstract

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、绪

        Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆。本文总结了一些这两门语言的差异之处,仅供参考。

二、C++

        对于C++这门语言,就其类来说成员访问类型就有  public、protected、private; 而就其继承方式来说 也分为共有继承、保护继承、私有继承。此外C++中有虚函数、纯虚函数之分,还有覆盖、隐藏之别。相对比较复杂。

        就其多态性而言:当基类指针指向派生类时,此时基类指针只能访问基类中已有的成员,而不能访问派生类中所特有的成员。我们理解哪怕是派生类中覆盖了基类中的成员,也只是将基类成员替换成类派生类成员,此成员仍归基类所有,常见的一些刁钻的题目中往往是派生类覆盖了基类或是隐藏了基类。覆盖和隐藏是有很大区别的,覆盖就是不再有原先的了,而隐藏只是对派生类对象来说访问的只能是派生类中新声明的成员,原先基类成员还存在。

        扩展一下如何区别C++中的覆盖和隐藏:

        发生覆盖必须满足:1    基类成员前有 viirtual 关键字。

                                        2    函数名相同

                                        3    参数列表相同

        发生隐藏可分为两种情况:

                    情况一:      1    基类成员没有virtual 关键字

                                        2    派生类中函数名相同(参数列表已经无所谓了) 

                   情况二:       1    基类成员有viirtual 关键字

                                        2     派生类中函数名相同而参数列表不限同

 

        重点声明:只要继承而来的函数在派生类中是可访问的,就会发生覆盖和隐藏,而不用考虑访问权限:比如说积累中的成员函数是 protected的,通过public继承,在派生类中定义了一个public的相同的函数,同样会发生覆盖和隐藏。

        举例示意:

#include<iostream>
using namespace std;
class CPerson
{
        protected:/*public*/
        /*virtual*/ void display()
        {
        cout<<"CPerson"<<endl;
        }
        public:
        void show()
        {
                display();
        }

};
class CStudent:public CPerson
{
public:
        void display()
        {
        cout<<"CStudent"<<endl;
        }
};
int main()
{
        CPerson *p=new CStudent();
        //********************重点看这里****************//
        //当基类中是public,没有virtual时
        p->display();//输出CPerson,发生了隐藏,对基类而言,原先的成员函数(display())还存在
        p->show();//输出CPerson,这个可以用上面的理论解释,即show中调用的是CPerson的display()
        //当基类中是public,有virtual时
        p->display();//输出CStudent,发生了覆盖,对基类而言,原先的成员函数被替换
        p->display();//输出CStudent,可以用上面的理论解释,即,替换后的成员还是CPerson的
        //当基类中是protected,没有virtual时,
        p->display();//错误,类外无法访问protected成员,(但其实发生了隐藏)
        p->show();//输出CPerson,show中的display(),是隐藏后的,因为只是隐藏,所以对基类而言,原先的d                  
           //isplay()还存在,所以不是CStudent
              //当基类中是pritected,有virtual是
        p->display();//错误,类外无法访问protected成员,(但已经发生了覆盖),只是覆盖后的函数成员对CPe                     
             //rson而言,依然是protected的
        p->show();   //输出,CStudent,因为发生了覆盖和替换。
        return 0;
}

 

三、java

        java相比较与C++没有virtual关键字,所以就没有虚函数。因此,区别覆盖和隐藏的方法就只是看参数列表相不相同了,相同则为覆盖,不同则为隐藏.另外java中的main函数是写在类中的,所以下面的例子中看起来protected跟public没有区别。

        补充:java中只有单继承,且只有公有继承。java中的赋值,其实就相当C++中的指针之间的赋值。

import java.util.*;
public class test extends quiz
{
        public static void  main(String []args)
        {
                quiz p3=new test();
                p3.display();//无论是public还是protected,都一样,因为是包内访问
                             //java没有virtual关键字,因此直接默认的就是覆盖而不是隐藏
                             //所以输出的是test;
        }
        public void add()
        {
                a++;
        }
        public/*protected*/ void display()
        {
          System.out.println("test");
        }

}

class quiz
{
        protected/*public*/ void display()
        {
        System.out.println("quiz");
        }

}
 

 四、在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是,如果基类方法是public,子类方法一定要声明为public。(就java而言)经常发生这类错误:在声明子类方法的的时候,遗漏了public修饰符。此时,编译器将会把它解释为试图降低访问权限。

 
                    
            
                

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#局部类型Partial发布时间:2022-07-13
下一篇:
C++练习|单链表的创建与输出(结构体格式)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap