首页 > 代码库 > c++继承、多态以及与java的行为差异之处
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
实现本身而言,应该没有想象那么难。
c++继承、多态以及与java的行为差异之处
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。