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

#include <stdio.h>
#include <iostream>
using namespace std;
 
#define __MODE1
 
class A
{
public:
    A()
    {
        std::cout << "A" << std::endl;
    }
    virtual ~A()// 虚析构函数,避免继承时子类未析构(有的编译器会提示段错误而终止,如MSVC)导致内存泄漏
    {
        std::cout << "~A" << std::endl;
    }
    virtual void print()// 虚函数,实现多态
    {
        std::cout << "A print" << std::endl;
    }
};
 
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;
    }
};
 
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;
    }
};
 
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;
    }
};
 
int main()
{
    #ifdef __MODE1
    std::cout << "--------------1--------------" << std::endl;
    A *pA, *pB, *pC, *pD;
    A *p = new A;
    p->print();
    pA = p;
    p = new B;// 多态的应用(父类的指针指向子类的对象)
    p->print();
    pB = p;
    p = new C;
    p->print();
    pC = p;
    p = new D;
    p->print();
    pD = p;
    std::cout << "--------------1析构--------------" << std::endl;
    p = NULL;
    delete pA;
    pA = NULL;
    delete pB;
    pB = NULL;
    delete pC;
    pC = NULL;
    delete pD;
    pD = NULL;
#else
    std::cout << "--------------2--------------" << std::endl;
    A *p1 = new A;
    p1->print();
    A *p2 = new B;
    p2->print();
    A *p3 = new C;
    p3->print();
    A *p4 = new D;
    p4->print();
    std::cout << "--------------2析构--------------" << std::endl;
    delete p1;
    p1 = NULL;
    delete p2;
    p2 = NULL;
    delete p3;
    p3 = NULL;
    delete p4;
    p4 = NULL;
#endif
    return 0;
}
 
发布了10 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Johnable/article/details/104047706