c++继承、多态以及与java的行为差异之处
2017-01-26 13:59
513 查看
对于面向对象而言,多态是最有用的基本特性之一,相对于函数指针,易用得多。下面看下c++继承和多态行为的基本特性,最后说明下和java的基本差别。
首先定义父类和子类。
base.h
base.cpp
Derived.h
Derived.cpp
基本使用:
输出如下:
从上面的代码和结果可以看出,c++跟java的要求或差别至少包括:
1、c++不要求类名和文件名保持一致,不过保持一致总是一个好习惯;
2、对于非抽象类,在定义对象时所使用的c++类型决定了实际类型,至于具体赋值的是什么类型应该是自动截掉了(虽然没有本质性差别,但是对于习惯了java的人员而言,明显多此一举)。
3、为了使用多态,必须至少有一个方法声明为虚函数。
刚想到反射(一般而言,如果要写一个框架比如RPC的话,掌握反射是必不可少的)的问题,总体而言,可以参考下面两个链接:
https://technet.microsoft.com/zh-cn/library/7k3448yy.aspx http://www.tuicool.com/articles/VJRVVrQ
实现本身而言,应该没有想象那么难。
首先定义父类和子类。
base.h
#pragma once class Base { public: int i; Base(void); ~Base(void); virtual void testDynCast(); };
base.cpp
#include "stdafx.h" #include "Base.h" #include <iostream> using namespace std; Base::Base(void) { } Base::~Base(void) { } void Base::testDynCast() { cout << i << endl; }
Derived.h
#pragma once #include "base.h" class Derived : public Base { public: void testDynCast(); Derived(void); ~Derived(void); };
Derived.cpp
#include "stdafx.h" #include "Derived.h" #include <iostream> using namespace std; Derived::Derived(void) { } Derived::~Derived(void) { } void Derived::testDynCast() { cout << (i * i) << endl; }
基本使用:
int _tmain(int argc, _TCHAR* argv[]) { //多态测试 Derived derived = Derived(); derived.i = 100; derived.testDynCast(); Base* dp1 = &derived; // 继承测试 if(Derived *dp = dynamic_cast<Derived*>(dp1)) { dp->testDynCast(); } Base base = Derived(); base.i = 100; base.testDynCast(); dp1 = &base; // 继承测试 if(Derived *dp = dynamic_cast<Derived*>(dp1)) { dp->testDynCast(); } cout << "继承测试结束" << endl; // 继承测试结束 }
输出如下:
10000 10000 100 继承测试结束
从上面的代码和结果可以看出,c++跟java的要求或差别至少包括:
1、c++不要求类名和文件名保持一致,不过保持一致总是一个好习惯;
2、对于非抽象类,在定义对象时所使用的c++类型决定了实际类型,至于具体赋值的是什么类型应该是自动截掉了(虽然没有本质性差别,但是对于习惯了java的人员而言,明显多此一举)。
3、为了使用多态,必须至少有一个方法声明为虚函数。
刚想到反射(一般而言,如果要写一个框架比如RPC的话,掌握反射是必不可少的)的问题,总体而言,可以参考下面两个链接:
https://technet.microsoft.com/zh-cn/library/7k3448yy.aspx http://www.tuicool.com/articles/VJRVVrQ
实现本身而言,应该没有想象那么难。
相关文章推荐
- java笔记之封装、继承、重写、多态以及类型转换
- java笔记之封装、继承、重写、多态以及类型转换
- java学习(6)-继承,多态,抽象类以及接口
- java笔记之封装、继承、重写、多态以及类型转换
- java中静态属性和和静态方法的继承问题 以及多态的实质
- Java基础温习 (6)重载,重写以及继承,多态的区别
- java的继承和多态,以及实例
- 深入剖析C++继承,多态以及隐藏(二)。(纯虚函数以及重写与隐藏)
- C++和Java对类继承的差异
- Java 继承加载顺序 以及 多态中变量和方法
- Java继承和多态===Java static关键字以及Java静态变量和静态方法
- java中静态属性和和静态方法的继承问题 以及多态的实质
- Java中的Package.Import.Class以及和C++的比较(三)--继承.抽象类.内部类.接口类
- java中的继承和多态以及重载和重写
- java中静态属性和和静态方法的继承问题以及多态的实质
- [Java]重载,重写以及继承,多态的区别
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- 《读java编程思想》 c++与java的不同(C++进阶 继承 组合 多态)
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- java中静态属性和和静态方法的继承问题 以及多态的实质