c++继承、多态以及与java的行为差异之处
对于面向对象而言,多态是最有用的基本特性之一,相对于函数指针,易用得多。下面看下c++继承和多态行为的基本特性,最后说明下和java的基本差别。
首先定义父类和子类。
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
实现本身而言,应该没有想象那么难。