您的位置:首页 > 编程语言 > C语言/C++

c++继承、多态以及与java的行为差异之处

2017-01-26 13:59 513 查看
对于面向对象而言,多态是最有用的基本特性之一,相对于函数指针,易用得多。下面看下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
实现本身而言,应该没有想象那么难。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: