Java/C++之 public、protected、private ; virtual & abstract
一、绪
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 ;
}
三、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修饰符。此时,编译器将会把它解释为试图降低访问权限。
Java/C++之 public、protected、private ; virtual & abstract的更多相关文章
- java中的public,protected,private权限修饰
public和private基本没问题,主要是默认的和protected之间的区别 同一包中默认的和protected一样,所以来看看不同包的情况 看下如下代码,两个类位于不同包: public cl ...
- JAVA修饰符类型(public,protected,private,friendly)
转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...
- JAVA类型修饰符(public,protected,private,friendly)
JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...
- [学习笔记]Java的public,protected,private,缺省的作用域
0.引言 Java的访问指示符public,protected,private,缺省可以用来修饰类和方法. 1.作用域如下 具体如下: 作用域 当前类 同一package 子孙类 ...
- java语言中public、private、protected三个关键字的用法,重写和重载的区别。
java语言中public.private.protected三个关键字的用法,重写和重载的区别. 解答: 作用域 当前类 同包 子类 其它 public √ √ √ √ protected √ √ ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- 【转载】C++中public,protected,private访问
第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...
- php public protected private属性实例详解
php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以 ...
- C++ 类访问控制(public/protected/private)
第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...
- 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意
大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...
随机推荐
- 转载文章(Redis中对key的操作)
转载地址:http://www.cnblogs.com/stephen-liu74/archive/2012/03/26/2356951.html 一.概述: 在该系列的前几篇博客中,主要讲述的是与R ...
- 初试WIX加SQL LocalDB
最近有个项目需要生成一个自动打包安装App和数据库的MSI文件,经同事推荐WIX,于是乎就试了一试.遇到了一些问题觉得有分享的价值,所以写篇博客记录一下 :) 使用感觉: WIX特点:功能很强大,用X ...
- 基于ARM处理器的反汇编器软件简单设计及实现
写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...
- datatable和list的转换
在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有list<T>检索方便.但是数据以ILIST形式返回,就为我们在.NET中使用传统的数据绑定造成了不便.下 ...
- 转载 NPOI Excel 单元格背景颜色对照表
NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...
- java、easyui-combotree树形下拉选择框
最近一直在研究这个树形的下拉选择框,感觉非常的有用,现在整理下来供大家使用: 首先数据库的表架构设计和三级菜单联动的表结构是一样,(父子关系) 1.下面我们用hibernate建一下对应的额实体类: ...
- 安装centos后无法引导启动windows7的解决方法
在电脑Windows7系统上安装Centos7,安装后找不到Windows7引导菜单. 原因:因为CentOS 7已采用新式的grub2系统,所以需要进入/boot/grub2目录后使用vi编辑gru ...
- MyBatis源码分析-IDEA新建MyBatis源码工程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- float4与half4数据类型
连续4个32位float类型数的向量 HLSL数据类型 GPU是以四维向量为基本单位来计算的.4个浮点数所组成的float4向量是GPU内置的最基本类型.使用GPU对两个float4向量进行计算,与C ...
- 【转】BAT 批处理脚本 教程
第一章 批处理基础第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在 ...