zoukankan      html  css  js  c++  java
  • 转:c++ 基类转换为派生类

     基类类型的引用或指针既可以引用基类对象,也可以引用派生类对象但编译器只把它当做基类类型对象

    #include <iostream>
    using namespace std;
    
    class base
    {
    public:
        base():cat(0){}
    
        void print()
        {
            cout << "cat" << cat << endl;
        }
    private:
        int cat;
    };
    
    class derive:public base
    {
    public:
        derive():base(),dog(1){}  //这里base()可以不用写,默认调用无参构造函数
    
        void print()
        {
            cout<< "dog" << dog << endl;
        }
    private:
        int dog;
    };
        
    int main()
    {
        base A;
        base *p;
        derive B;
        p = &A;
        p->print();
        p = &B;
        p->print();
        return 0;
    }

    会输出cat0 cat0

    可以看出两个都调用了基类对象的print 函数。

     但是派生类的引用转换不同于转换对象

    。将派生类对象传给基类的引用,引用直接绑定该对象对象本身未被复制。

    将派生类对象传给希望接受基类类型的对象(非引用),则派生类对象的基类部分被复制到基类形参

    #include <iostream>
    using namespace std;
    
    class base
    {
    public:
        base():cat(0){}
    
        void print()
        {
            cout << "base" << cat << endl;
        }
    protected:
        int cat;
    };
    
    class derive:public base
    {
    public:
        derive()
        {
            cat = 1;
        }
    
        void print()
        {
            cout<< "derive" << cat << endl;
        }
    };
        
    int main()
    {
        derive B;
        base A(B);
        base C = B;
    
        A.print();
        C.print();
        return 0;
    }

    代码执行结果为base1   base1

    很明显执行的是基类的print函数,但是也执行派生类的构造函数并把cat参数的值传给了基类.

    via:

    http://blog.csdn.net/z0203153008/article/details/4619279

     

  • 相关阅读:
    [最短路径SPFA] POJ 1847 Tram
    [强连通分量] POJ 1236 Network of Schools
    [强连通分量] POJ 2762 Going from u to v or from v to u?
    [强连通分量] POJ 2186 Popular Cows
    [宽度优先搜索] HDU 1372 Knight Moves
    php错误级别和异常处理
    php配置优化
    魔术方法和魔术常量
    事务
    mysql备份和还原
  • 原文地址:https://www.cnblogs.com/youxin/p/2566352.html
Copyright © 2011-2022 走看看