c++中继承和java中继承的对比

java中:

class Parent{
    public void test(int a){
        System.out.println("Parent:" + a);
        System.out.println(this.getClass().getName());
    }
}

class Child extends Parent{
    public void test(int a, int b){
        System.out.println("Child:" + a + " " + b);
    }
}

public class ParentAndChild {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Child ch = new Child();
        ch.test(5);//也就是说在java中子类会将父类的方法继承过来,没有隐藏,对于
                   //同名同参的是覆盖,对于同名不同参的是重载
    }

}
/*
   输出结果:
     Parent:5
     testone.Child
*/

c++中:

#include<iostream>
using namespace std;

class Parent{
    public:

     static void run(){
        cout<<"Parent"<<endl;
     }
        void test(int a){
            cout<<"Parent:"<<a<<endl;
        }

        void test(int a, int b){
            cout<<"Parent:"<<a<<" "<<b<<endl;
        }
};

class Child : public Parent{
    public:

          /* static void run(){//这两种写法都是正确的
			        cout<<"Child"<<endl;
      }
      void run(){
        cout<<"Child"<<endl;
      }
      */
void test(int a, int b){
            cout<<"Child:"<<a<<" "<<b<<endl;
        }
};

int main(){
    Child ch;
    ch.Parent::test(5, 4);//通过这种调用可以访问父类的同名函数
    //ch.test(4); //错误:派生类和基类中存在同名的函数,基类中的该函数被隐藏,也就是找不到
                  //应该写成ch.Parent::test(4);
    return 0;
}

区别:在c++中,重载不会发生在基类与派生类之间!当基类和派生类中存在同名函数时,无论同名函数的形参个数或者类型是否相同,派生类中的同名函数都会将基类中的同名函数隐藏(将在下边说明隐藏)掉,而不会是重载关系。这时,当你通过派生类对象调用该同名函数时,只能访问派生类的该函数,如果硬要访问基类的该函数,则需要在函数名前加上类作用域!如上述代码所示。而在java中子类会将父类中的方法继承过来,子类中同名方法会和父类中的同名方法要么是重载关系,要么是覆盖关系,要么就错误(比如同名同参却是不同的返回类型!)

在c++中隐藏只能出现在基类和派生类之间,而不能发生在同一个类内(否则会引起编译器出现二义性)。当基类和派生类中存在同名函数时,无论同名函数的形参个数或者类型是否相同,派生类中的同名函数都会将基类中的同名函数(这个函数不论是静态或者是非静态都可以,如上述例子)隐藏掉,而不会是重载关系。这时,当你通过派生类对象调用该同名函数时,只能访问派生类的该函数,如果硬要访问基类的该函数,则需要在函数名前加上类作用域!对于虚函数(用virtual修饰的),如果基类中有一个虚函数,派生类中同样有一个同名同参的函数(那么该函数将自动虚化), 那么其返回值一定要和基类的虚函数的返回值相同!否则隐藏失败!

但是在java中请记住这样的原则:非静态方法只能由(或被)非静态方法覆盖!静态方法只能由(或被)非静态方法覆盖!抽象方法必须在具体类中被覆盖!最终方法(带关   键字final的方法)不能被覆盖!

时间: 2024-10-24 17:20:10

c++中继承和java中继承的对比的相关文章

接口继承-关于java中Dao模块接口问题,请教一下原理

问题描述 关于java中Dao模块接口问题,请教一下原理 BaseDao.java public interface BaseDao {} BaseDaoImpl.java public abstract class BaseDaoImpl implements BaseDao {} UserService.java public interface UserService extends BaseDao{} UserServiceImpl.java public class UserServi

java swing中的弹窗-Java 中如何控制弹出窗口的关闭,类似于QQ的天气的弹窗

问题描述 Java 中如何控制弹出窗口的关闭,类似于QQ的天气的弹窗 本人新手,我想做一个就类似于QQ的天气的弹窗得东西,谁帮我完善一下后面的代码 我的想法是:鼠标移动到label上弹出一个窗口,移出这个label后几秒内判断鼠标移动是否到了这个窗口上,如没有就关闭这个窗口. package com.frame; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridBagConstraints;

java中事件处理问题-java中事件处理,红色下划线标记的为什么是错的,求解?

问题描述 java中事件处理,红色下划线标记的为什么是错的,求解? 5C 解决方案 你将鼠标移动到错误的地方,看看它提示什么,根据提示的信息再搜索答案. 解决方案二: 是不是还有ActionListener接口方法没实现? 解决方案三: 解决了,我也是醉了actionperformed中的p应该大写....,还是谢谢你们的热情回答! 解决方案四: 你没有实现这个接口的方法 解决方案五: 把鼠标放到红线上,当出现 Add unimplemented methods 时,点击Add unimplem

详解java中Reference的实现与相应的执行过程_java

一.Reference类型(除强引用) 可以理解为Reference的直接子类都是由jvm定制化处理的,因此在代码中直接继承于Reference类型没有任何作用.只能继承于它的子类,相应的子类类型包括以下几种.(忽略没有在java中使用的,如jnireference)      SoftReference      WeakReference      FinalReference      PhantomReference 上面的引用类型在相应的javadoc中也有提及.FinalRefere

关于java中接口的作用

问题描述 关于java中接口的作用 java中接口有什么作用,新手,求教.为什么要写接口 我直接写实现的方法不就行了么 接口又有什么用 字典上解释接口时说系统中两个不同部分的链接的地方对吗 解决方案 你先要知道什么是接口,其次定义接口的作用,比如有一个类要实现好多方法,你不能让这个类继承所有的类去实现它里面的方法,因为java只支持单继承,当你用了接口以后,你可以在接口里面定义好那个类所需要的方法,然后让该类实现这个接口就可以,这样的话,就相当于你实现了一个类继承了多个类,而且在继承和接口中,还

Java中的多态用法实例分析_java

本文实例讲述了Java中的多态用法.分享给大家供大家参考.具体分析如下: 多态,是面向对象的程序设计语言最核心的特征.封装性.继承性都比较简单,所以这里只对多态做一个小小的笔记... 1.什么是多态? 多态意味着一个对象可以多重特征,可以在特定的情况下,表现出不同的状态,从而应对不同的属性和方法.在Java中,多态的实现指的是使用同一个实现接口,以实现不同的对象实例. 例如,我们定义一个Parent类,再定义一个getName()方法返回一个字符串,定义一个形参为Parent类型的成员方法doS

java中extends与implements的区别浅谈_java

1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个

Java中String、StringBuffer、StringBuilder的区别详解_java

 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在

理解Java中的引用传递和值传递

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论. >>基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型的变量保存引用值,"引用值"指向内存空间