我有以下代码,我尝试使用shared_ptr
以多态形式使用。
using namespace std;
class Base
{
public:
int ClassID; // Used only by derived classes
string Name;
shared_ptr<Base> Parent; // For TreeCtrl-like hierarchy
}
class DerivedA : public Base
{
public:
double Length;
double Width;
double Height;
}
class DerivedB: public Base
{
public:
double Radius;
}
class Controller
{
public:
vector<shared_ptr<Base>> Objects;
void CreateObject(int class_id, string name, shared_ptr<Base> parent)
{
shared_ptr<Base> temp;
switch(class_id)
{
case DERIVEDA: // enum definition assumed
temp = make_shared<DerivedA>(name, parent); // constructors assumed
break;
case DERIVEDB:
temp = make_shared<DerivedB>(name, parent);
break;
}
Objects.push_back(temp);
}
}
我的问题是,当我检查多态性是否有效时(使用VS2013的调试器),我只得到Base
类的成员(我的研究显示我&#39;我将遇到与功能相同的问题)。使用dynamic_pointer_cast
似乎不起作用。如何才能访问Derived
班级的所有成员?
答案 0 :(得分:3)
dynamic_pointer_cast
依靠dynamic_cast
正常运作。如果dynamic_cast
不起作用,则dynamic_pointer_cast
也无效。
在您的情况下,由于dynamic_cast
没有任何Base
成员函数,virtual
将无效。将virtual
成员函数添加到Base
,或使Base
的析构函数成为虚拟析构函数。之后,dynamic_pointer_cast
应该有效。
class Base
{
public:
// Add this.
virtual ~Base() {}
int ClassID; // Used only by derived classes
string Name;
shared_ptr<Base> Parent; // For TreeCtrl-like hierarchy
};