首页 > 代码库 > 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的行为差异之处