笔记1——C++多态与Java多态的异同
来源:互联网 发布:mac 照片 相簿 文件夹 编辑:程序博客网 时间:2024/05/23 11:40
最近参加网易笔试遇到一个问题,考察了C++ 多态特性,自己查了相关资料学习了相关用法。
一般程序调用的函数地址是在编译期决定了,但是具有多态特性的函数调用地址是在程序运行期才决定。
C++与Java多态的区别
同
- 子类重写父类的函数,程序运行时根据不同对象执行相应函数
异
- C++中子类只有重写父类的virtual函数时,此函数才具备多态特性
来两个简单列子说明:
C++
#include <iostream>class A{ public: virtual void f(){ std::cout << "A " << std::endl; } void f1(){ std::cout << "A1 " << std::endl; } };class B : public A{ public: void f(){ std::cout << "B " << std::endl; } void f1(){ std::cout << "B1 " << std::endl; } };int main(int argc, char *argv[]){ //多态特性的考察 A *pa = new A(); pa->f(); B *pb = (B *)pa; pb->f(); delete pa,pb; pa = new B(); pa->f(); pb = (B *)pa; pb->f(); //非多态特性的考察 pa = new A(); pa->f1(); pb = (B *)pa; pb->f1(); delete pa,pb; pa = new B(); pa->f1(); pb = (B *)pa; pb->f1(); return 0;}
程序结果
- A A B B
- A1 B1 A1 B1
多态性的考察中,第一个父类指针pa指向了父类对象A,故调用了父类对象A中的方法;第二个虽说将父类对象强制转换成了子类对象,但实际上子类指针指向的仍是父类对象;第三个父类指针指向了子类对象B,故调用子类对象B中的方法;第四个子类指针指向的仍然是子类对象B,故调用了子类对象B中的方法。
非多态性的考察中,主要看编译时指针是哪种类型的指针,故调用的就是相应类型的方法。
Java
class A{ public void f(){ System.out.println("A"); }}class B extends A{ public void f(){ System.out.println("B"); }}public class Test{ public static void main(String[] args){ A a = new A(); a.f(); a = new B(); a.f(); }}
程序结果:A B
0 0
- 笔记1——C++多态与Java多态的异同
- JAVA与C++的多态异同
- C语言与Java的异同
- C语言与Java的异同
- java引用与C指针的异同
- 比较C#与C++、Java的异同
- Java与C/C++的异同点
- Java框架研究——JSF与Struts的异同
- Python 面向对象与 C++、Java 的异同
- java 与 c#的异同
- C++与JAVA的异同
- C#与java的异同
- objective-c与c的异同
- Object_c基础——oc程序与C语言程序开发过程的异同简单认识
- Objective-C 与 C++ 的异同
- golang指针与C指针的异同
- c与c++输入输出二进制文件的异同
- Objective-c - 函数与block的异同
- 关于JS原型链
- 在Myeclipse中给Maven项目添加框架支持
- [二分图最大匹配必配点] BZOJ 3546 [ONTAK2010]Life of the Party
- circle POJ动态规划某一题。。题号。。。额。。。。
- friend 关键字 对于模板 并不仅仅只是友元!!!
- 笔记1——C++多态与Java多态的异同
- 快速第三方入口(持续关注)
- AngularJS学习之Controller控制器之间的通信
- iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA
- [LeetCode]--143. Reorder List(Python + Java)
- 嘟嘟聊Unity:写给不知如何学Unity3D的爱好者
- linq ,lamda 进行分组GroupBy查询
- Single Number
- 安卓简易版图片异步加载