zoukankan      html  css  js  c++  java
  • c++多态多实例

    #include <bits/stdc++.h>
    using namespace std;
    class A
    {
    public:
        A()
        {
            cout << "构造A" << endl;
            s = new char[20];
            memset(s, 0, 20);
            strcpy(s, "hahaha");
        }
        virtual ~A()
        {
            cout << "析构A" << endl;
            delete []s;
        }
        virtual void print()
        {
            cout << s << endl;
        }
    private:
        char *s;
    };
    class B :  public A
    {
    public:
        B()
        {
            cout << "构造B" << endl;
            s = new char[20];
            memset(s, 0, 20);
            strcpy(s, "BBBBB");
        }
        virtual ~B()
        {
            cout << "析构B" << endl;
            delete []s;
        }
        virtual void print()
        {
            cout << s << endl;
        }
    private:
        char *s;
    };
    
    void ok(A *obj)
    {
        obj->print();
    }
    void okk(A obj)
    {
        obj.print();
    
    }

    1.

    int main()
    {
        B *b = new B;
        A *obj = b;
        obj->print();
        delete b;
        
        /*构造A
        构造B
        BBBBB
        析构B
        析构A*/
    }

    2.

    int main()
    {
        B *b = new B;
        A *obj = b;
        obj->print();
        delete obj;
    
        /*构造A
        构造B
        BBBBB
        析构A*/
    }

    3.

    int main()
    {
        B b;
        A a = b;
        A *pa = &b;
        a.print();//这里的a就是一个A类型的变量,它的内存布局在赋值的时候已经从B转换到A了,多于的数据都被丢弃,因此其就是一个A类型的变量。
        pa->print();//其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现
    
        /*构造A
        构造B
        hahaha
        BBBBB
        析构A
        析构B
        析构A*/
    }

    4.

    int main()
    {
        B *b = new B;
        ok(b);
    
        /*构造A
        构造B
        BBBBB*/
    }

    5.

    int main()
    {
        B *b = new B;
        ok(b);
        delete b;
        
        /*构造A
        构造B
        BBBBB
        析构B
        析构A*/
    }

    6.

    int main()
    {
        B b;
        okk(b);
    
        /*构造A
        构造B
        hahaha
        析构A
        析构B
        析构A*/
    }

    7.

    int main()
    {
        B *b = new B;
        A a;
        b = &a; //报错,不能让子类指针指向父对象
        ok(b);
    }
  • 相关阅读:
    codeblocks 更换颜色主题
    python3 回顾笔记1
    linux查找目录下的所有文件中是否含有某个字符串
    jupyter notebook 远程访问
    ubuntu ufw防火墙
    加载大量的xml数据 使用压缩方法解决(当然较小时也可以压缩)
    lua string介绍
    Lua和C++交互详细总结
    编写高性能的 Lua 代码
    lua中遍历table的几种方式比较
  • 原文地址:https://www.cnblogs.com/lesroad/p/10778121.html
Copyright © 2011-2022 走看看