Thanks for answers,
the const ptr was a fault.
Well, the following example shows the problem in detail:
----8<----
#include <iostream>
#include
struct Spec {
Spec(const char* n) : m_name(n) { }
void member() const { std::cout << "Hold " << m_name << std::endl; }
const char* m_name;
};
struct SpecLP : public Spec {
SpecLP(const char* n) : Spec(n) { std::cout << "construct " << m_name <<
std::endl; }
~SpecLP() { std::cout << "destruct " << m_name << std::endl; }
};
struct SpecHP : public Spec {
SpecHP(const char* n) : Spec(n) { std::cout << "construct " << m_name <<
std::endl; }
~SpecHP() { std::cout << "destruct " << m_name << std::endl; }
};
struct Doc {
virtual ~Doc() { }
virtual void set(boost::shared_ptr<Spec>& ptr) = 0;
};
struct LpDoc : public Doc {
LpDoc() : m_lp( new SpecLP("LpDoc::lp") ) { }
void set(boost::shared_ptr<Spec>& spec) {
// m_lp = boost::shared_static_cast<SpecLP>( spec );
m_lp = boost::shared_polymorphic_cast<SpecLP>( spec );
}
void print() { m_lp->member(); }
boost::shared_ptr<SpecLP> m_lp;
};
struct HpDoc : public Doc {
HpDoc() : m_hp( new SpecHP("HpDoc::hp") ) { }
void set(boost::shared_ptr<Spec>& spec) {
// m_hp = boost::shared_static_cast<SpecHP>( spec );
m_hp = boost::shared_polymorphic_cast<SpecHP>( spec );
}
void print() { m_hp->member(); }
boost::shared_ptr<SpecHP> m_hp;
};
int main()
{
boost::shared_ptr<Spec> lp( new SpecLP("lp") );
boost::shared_ptr<Spec> hp( new SpecHP("hp") );
LpDoc doc;
std::cout << "Case 1:\n";
doc.print();
doc.set( lp ); // is O.K.
doc.print();
std::cout << "Case 2:\n";
try {
doc.print();
doc.set( hp ); // should throw
doc.print();
}
catch(const std::bad_alloc& e) {
std::cerr << "Exception \"" << e.what() << "\" catched\n";
}
}
---->8----
It doesn't compile with shared_ptr. Imho is the polymorph code correct
expect the pointer problem.
Thanks
Olaf