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-11-05 20:43:38

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

android开发中,在java中如何使用c提供过来char*

这个char*如果是一般的字符串的话,作为string传回去就可以了.如果是含有'\0'的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到'\0'就截断了. 有两种方式传递得到的数据: 一种是在jni中直接new一个byte数组,然后调用函数(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接return

Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题

众所周知,我们既可以在 activity_main.xml文件中控制activity中的view,也可以使用java代码的set..()方法控制它.在学习过程中,发现在ADT新版本中,和以前版本有区别: 新建Andriod工程后,MainActivity 不再继承Activity,而继承的是ActionBarActivity:在layout文件夹下会自动生成两个.xml文件,activity_main.xml文件和fragement_main.xml文件,和以前的版本只有一个activity_m

[引用区别] c++中引用与java中引用区别

综述: 在Java中,类实例声明和构造是分开."T a;"是声明,而"a=new T();"才是构造.引用声明和C++相同.但是Java的机制与C++不同,Java中的引用也叫句柄,或者说句柄才是其真实名称.类声明的都是一个句柄,调用构造函数才会使得句柄指向类实例.因此Java中没有类似于C++中的复制函数,因为Java的复制都是直接复制句柄内容.例如"T b=a;"只不过是将a的句柄复制(赋值)给了b,从而b也指向a指向的类实例.可以看出Jav

c++中怎么实现Java中finally语句

所有学习c++的书籍都明确提出了,不要使用goto, 以免造成程序流程的混乱,使理解和调试程序都产生困难. 但是我们遇到这样一个场景怎么办:就是不管程序执行成功与否,都要执行一些资源释放语句,相当java中的finally语句.c++的中没有finally的支持,即使使用try catch,资源释放也需要写两次,执行成功一次,catch中一次.使用goto可以很优雅的实现了finally. void fun() { INT32 rc=OK; rc=doSomeThing(); check(rc)

java中面向对象好处 Java中 接口作用

使用面向对象思想进行开发有以下优点:1.易维护采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的.2.质量高在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量.3.效率高在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类.使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量.4.易扩展由于继承.封装.多态的特性,自然设计出高内聚.低耦合

基础:c++中引用与java中的引用

using namespace std; class Point { public: double x; double y; Point(){} void setPoint(double x,double y ) { this->x = x; this->y = y; } Point(double xx,double yy) { this->x=xx; this->y=yy; } }; class Point1 { public: Point point; void set() {

C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子

直接上代码了. Java控制台代码: package Test; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import org.apache.commons.codec.binary.Base

java中接口和继承的区别

实际概念区别:区别1:不同的修饰符修饰(interface),(extends)区别2:在面向对象编程中可以有多继承!但是只支持接口的多继承,不支持'继承'的多继承哦而继承在java中具有单根性,子类只能继承一个父类区别3:在接口中只能定义全局常量,和抽象方法而在继承中可以定义属性方法,变量,常量等...区别4:某个接口被类实现时,在类中一定要实现接口中的抽象方法而继承想调用那个方法就调用那个方法,毫无压力 接口是:对功能的描述      继承是:什么是一种什么 始终记者:你可以有多个干爹(接口

C++和Java中继承的个人感觉

C++中的继承和Java中的继承区别不大,但是对于一个新手来说,C++中使用单冒号继承, 跟Java中的extends相比,java中对新手相对友好一点,C++中“::”和“:”的理解相对于 我这样的新手不太友好.前期只好以会用为主了,比如在继承中单冒号的作用是声明基类. 继承的方式: (java) //基类 public 类名 {属性 方法} //派生类 public 派生类 extends 基类 {属性 方法} 在java中类的访问修饰符是在类前定义可以很方便的看到这个类的类型到底如何,但是