Пример с виртуальным деструктором, рассмотренный на встрече:
// 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;
}
Пример с виртуальным деструктором, рассмотренный на встрече: