zoukankan      html  css  js  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++ primer 中讲的顶层const 和 底层 const 理解
    github 0 学习
    MySQL 0 学习
    c++11 move构造函数和move operator 函数 学习
    c++11 多线程 1
    c++ 多线程 0
    学习 emplace_back() 和 push_back 的区别 emplace_back效率高
    crontab执行脚本失败问题
    lucene 排序
    maven 内置变量
  • 原文地址:https://www.cnblogs.com/zhjh256/p/6351563.html
Copyright © 2011-2022 走看看