Skip to content

Замечания по программе Bodies #14

@alexey-malov

Description

@alexey-malov

Пример с виртуальным деструктором, рассмотренный на встрече:

// virtual_destructor.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <memory>

using namespace std;

class CInternalObject
{
public:
    ~CInternalObject()
    {
        cout << "~CInternalObject" << endl;
    }

};


class CBase
{
public:
    virtual ~CBase()
    {
        DoSomething();
    }

    virtual void AbstractMethod() = 0;

    virtual void DoSomething()
    {
        //AbstractMethod();
        cout << "CBase::DoSomething()" << endl;
    }
};

class CDerived : public CBase
{
    CInternalObject m_someObj;
    virtual void DoSomething()override
    {
        cout << "CDerived::DoSomething()" << endl;
    }

    virtual void AbstractMethod() override
    {
        cout << "CDerived::AbstractMethod" << endl;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    {
        cout << "automatic lifetime" << endl;
        CDerived derived;
    }

    {
        cout << "dynamic lifetime 1" << endl;
        auto derived = new CDerived();
        delete derived;
    }

    {
        cout << "dynamic lifetime 2" << endl;
        auto derived = make_unique<CDerived>();
    }

    {
        cout << "dynamic lifetime 3!!!" << endl;
        unique_ptr<CBase> base = make_unique<CDerived>();
    }

    {
        cout << "dynamic lifetime 4" << endl;
        shared_ptr<CBase> base = make_shared<CDerived>();
    }

    {
        cout << "dynamic lifetime 5" << endl;
        shared_ptr<void> base = make_shared<CDerived>();
    }

    {
        cout << "dynamic lifetime 6!!!" << endl;
        shared_ptr<CBase> base = shared_ptr<CBase>(static_cast<CBase*>(new CDerived));
    }
    return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions