A picture is worth a thousand words
#include <iostream>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
class A: public boost::enable_shared_from_this<A>
{
public:
typedef A Self;
typedef Self Root;
typedef boost::shared_ptr<Self> SPtr;
public:
A(){ std::cerr << "DEBUG: A::A()" << std::endl; }
virtual ~A(){ std::cerr << "DEBUG: A::~A()" << std::endl; }
SPtr getSPtr()
{
return shared_from_this();
}
};
class B: public A
{
public:
typedef B Self;
typedef A Base;
typedef Base::Root Root;
typedef boost::shared_ptr<Self> SPtr;
public:
B(){ std::cerr << "DEBUG: B::B()" << std::endl; }
virtual ~B(){ std::cerr << "DEBUG: B::~B()" << std::endl; }
SPtr getSPtr()
{
return boost::dynamic_pointer_cast<Self>(Root::getSPtr());
}
};
#define CHECKPOINT std::cerr << "CHECKPOINT: " __FILE__ " (" << __LINE__ << ")" << std::endl
int main()
{
CHECKPOINT;
A::SPtr spX(new A);
CHECKPOINT;
B::SPtr spY(new B);
CHECKPOINT;
return 0;
}
Compile!
g++ -W -Wall -Wextra -pedantic -Os shared_vs_inheritance.cpp -o shared_vs_inheritance
Run!
CHECKPOINT: shared_vs_inheritance.cpp (42) DEBUG: A::A() CHECKPOINT: shared_vs_inheritance.cpp (44) DEBUG: A::A() DEBUG: B::B() CHECKPOINT: shared_vs_inheritance.cpp (46) DEBUG: B::~B() DEBUG: A::~A() DEBUG: A::~A()
No comments:
Post a Comment