C++多态实现(通过虚继承、虚函数实现)及虚析构函数,多重继承和多级继承,纯虚函数和抽象类的使用实例

C++多态实现(通过虚继承、虚函数实现)及虚析构函数,多重继承和多级继承,纯虚函数和抽象类的使用实例

代码可以直接copy运行:

继承关系:

类AbstractBase被类A继承,类A被类B和类C继承,类B和类C同时被类D继承。

#include <string>
#include <iostream>
using namespace std;

#define __MODE1
//#define __MODE2
namespace NM_ENUM {
    enum Type{T_A, T_B, T_C, T_D};
}

class AbstractBase{// 抽象类
public:
    AbstractBase(){}
    virtual ~AbstractBase(){}
    virtual void setType() = 0;// 纯虚函数(含有纯虚函数的类是抽象类,不能实例化对象)
    virtual void print() = 0;
    NM_ENUM::Type getType()
    {
        return m_eType;
    }
    NM_ENUM::Type           m_eType;
};

class A : public AbstractBase
{
public:
    A()
    {
        std::cout << "A" << std::endl;
    }
    ~A()// 虚析构函数,避免继承时子类未析构(有的编译器会提示段错误而终止,如MSVC)导致内存泄漏
    {
        std::cout << "~A" << std::endl;
    }
    void print()// 虚函数,实现多态
    {
        std::cout << "A print" << std::endl;
    }

    void setType()
    {
        m_eType = NM_ENUM::T_A;
    }

    string              m_a;
};

class B: virtual public A// 虚继承,解决D对B、C多继承时的冲突
{
public:
    B()
    {
        std::cout << "B" << std::endl;
    }
    ~B()
    {
        std::cout << "~B" << std::endl;
    }
    void print()
    {
        std::cout << "B print" << std::endl;
    }

    void setType()
    {
        m_eType = NM_ENUM::T_B;
    }

    string              m_b;
};

class C: virtual public A
{
public:
    C()
    {
        std::cout << "C" << std::endl;
    }
    ~C()
    {
        std::cout << "~C" << std::endl;
    }
    void print()
    {
        std::cout << "C print" << std::endl;
    }

    void setType()
    {
        m_eType = NM_ENUM::T_C;
    }

    string              m_c;
};

class D: public B, public C// 多重继承+多级继承
{
public:
    D()
    {
        std::cout << "D" << std::endl;
    }
    ~D()
    {
        std::cout << "~D" << std::endl;
    }
    void print()
    {
        std::cout << "D print" << std::endl;
    }

    void setType()
    {
        m_eType = NM_ENUM::T_D;
    }

    string              m_d;
};

void transferParameter(AbstractBase *p)
{
    p->print();
}

int main()
{
#ifdef __MODE1
    std::cout << "--------------MODE1构造--------------" << std::endl;
    A *pA, *pB, *pC, *pD;
    std::cout << "-----A-----" << std::endl;
    A *p = new A;
    p->print();
    pA = p;
    std::cout << "-----B-----" << std::endl;
    p = new B;// 多态的应用(父类的指针指向子类的对象)
    p->print();
    pB = p;
    std::cout << "-----C-----" << std::endl;
    p = new C;
    p->print();
    pC = p;
    std::cout << "-----D-----" << std::endl;
    p = new D;
    p->print();
    pD = p;

    transferParameter(p);// 测试参数传递

    dynamic_cast<D *>(p)->m_d = "this is D menber data";
    std::cout << "data:" << dynamic_cast<D *>(p)->m_d << std::endl;

    std::cout << "--------------MODE1析构--------------" << std::endl;
    p = NULL;
    std::cout << "-----~A-----" << std::endl;
    delete pA;
    pA = NULL;
    std::cout << "-----~B-----" << std::endl;
    delete pB;
    pB = NULL;
    std::cout << "-----~C-----" << std::endl;
    delete pC;
    pC = NULL;
    std::cout << "-----~D-----" << std::endl;
    delete pD;
    pD = NULL;
#endif

#ifdef __MODE2
    std::cout << "--------------MODE2构造--------------" << std::endl;
    std::cout << "-----A-----" << std::endl;
    A *p1 = new A;
    p1->print();
    std::cout << "-----B-----" << std::endl;
    A *p2 = new B;
    p2->print();
    std::cout << "-----C-----" << std::endl;
    A *p3 = new C;
    p3->print();
    std::cout << "-----D-----" << std::endl;
    A *p4 = new D;
    p4->print();
    std::cout << "--------------MODE2析构--------------" << std::endl;
    std::cout << "-----~A-----" << std::endl;
    delete p1;
    p1 = NULL;
    std::cout << "-----~B-----" << std::endl;
    delete p2;
    p2 = NULL;
    std::cout << "-----~C-----" << std::endl;
    delete p3;
    p3 = NULL;
    std::cout << "-----~D-----" << std::endl;
    delete p4;
    p4 = NULL;
#endif
    return 0;
}

运行结果:

使用条件编译__MODE1:

使用条件编译__MODE2:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值