对比下面,在同样不使用虑函数的情况下,指向导出类的基类指针在调用导出类中重载了的方法时结果不同。
C++代码:
class A{
public:
void f1(){cout << "class A\n" ;}
};
class B :public A{
public:
void f1(){cout << "classB\n";}
};
void main() {
A *a = new B;
a -> f1();
delete a;
}
输出结果:
Class A
Java代码:
class A {
publicvoid show(){System.out.println("class a");}
}
class B extends A{
publicvoid show(){System.out.println("class b");}
}
publicclass Main {
publicstaticvoid main(String[] args) {
A a = new B();
a.show();
}
输出结果:
class b
如果使用了虚函数c++和java的结果一样。
产生以上差异是不同语言的绑定方式不同造成的。绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。静态绑定可以理解为程序在编译期进行的绑定,而动态绑定指在运行时根据具体对象的类型进行绑定。
在java中只有final、static、private和构造方法是静态绑定的,其它所有方法都采用动态绑定。而c++中是进行的是静态绑定,只有虚函数进行的是动态绑定。所以c++中A类的指针只会调用A类的方法,虽然它指向的是一个B类的对象。而在java中虽然引用是A类的,但是由于动态绑定的关系,当通过方法名调用方法时,jvm会判断出当前对象的类型是B而不是A,所以会调用B类的中的相应方法。
相关推荐
在C++编程语言中,动态绑定和静态绑定是两种关键的多态实现方式,它们对于理解和编写高效、灵活的代码至关重要。多态性允许我们通过一个共同的基类接口访问不同派生类的对象,从而提高了代码的重用性和可扩展性。 ...
1、讲解和演示动态绑定与静态绑定的概念与原理; 2、讲解和演示虚析构函数的概念与原理,并讲解为什么构造函数不能使用虚函数的原因;
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、...
C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分。 我是在一个类的继承体系中分析的,因此下面所说的对象一般是指一个类的实例。 首先我们需要明确几个名词定义: 静态...
- **动态绑定**:Java中的方法调用分为静态绑定(如静态方法调用)和动态绑定(如实例方法调用)。动态绑定是指在运行时根据对象的实际类型来决定调用哪个方法。 - **方法调用指令**:JVM提供了四种方法调用指令,...
我对于C++动态绑定的理解,一句话,是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态 智能执行正确虚拟函数的技术。因此要彻底理解动态绑定技术,只需要掌握两点,一是编译器的静态编译过程,...
### C++与Java的不同 在IT领域中,C++与Java是两种非常流行的编程语言,它们各自具有独特的特性和用途。对于那些从C++转向Java的开发者来说,了解这两种语言之间的差异至关重要。本文将深入探讨C++与Java的主要区别...
在IT行业中,跨语言通信是常见的需求之一,尤其是在Java与C++之间。为了实现这种通信,我们可以使用Java Native Access(JNA),它是一种无需编写原生代码就能直接调用操作系统API或其他本地库的Java库。本篇文章将...
Java的面向对象特性与C++类似,但其安全性、稳定性和可移植性更强。 "面向对象程序设计模拟试卷.doc"文件很可能是包含了一些面向对象编程的理论问题和实践题目,涵盖C++和Java的基本概念、语法、类的设计以及面向...
6. 动态绑定:在Java中,多态通常是通过动态绑定(也称运行时绑定)实现的,即方法调用与实际执行的方法在编译时并不确定,而是在运行时根据对象的实际类型决定。 通过实践这三个语言的面向对象编程,我们可以深入...
- **C++**:支持动态绑定和静态绑定,通过虚函数(virtual function)实现多态性。 - **JAVA**:默认支持动态绑定,即方法调用时根据对象的实际类型决定调用哪个方法。 #### 十一、值类型与指针类型 - **C++**:支持...
标题中的“一个基于C++17的lua绑定库”指的是使用C++17标准实现的与Lua脚本语言交互的库。这样的库允许C++程序调用Lua脚本中的函数,同时也让Lua能够访问和操作C++的对象和数据。Lua绑定库在游戏开发、自动化工具和...
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...
6. **编译和集成**:生成的Lua绑定代码需要编译成静态库或动态库,并链接到游戏项目中。同时,将生成的lua文件添加到项目资源中,以便在游戏中加载和使用。 7. **测试和调试**:在Lua脚本中引用生成的绑定,测试C++...
在深入探讨"C++ 静态成员变量与嵌套类的内存分配回收"这一主题之前,我们首先需要理解几个核心概念:静态成员变量、嵌套类以及它们在内存管理中的角色。 ### C++中的静态成员变量 静态成员变量是类的一个特性,它...
本篇文章将详细讲解如何在C++中调用WebService,包括静态和动态方式,并探讨相关的源码实现。 首先,让我们理解什么是WebService。WebService是一种基于XML的开放标准,允许不同平台和应用程序之间进行互操作。它...
这种机制被称为动态绑定或运行时多态,与静态绑定(编译时多态)相对。下面我们将深入探讨虚函数的原理及其在C++中的实现方式。 首先,每个包含虚函数的类都会有一个虚函数表(vtable),这个表存储了类中所有虚...