无法使用 BaseClass 的 shared_ptr 访问 Derived Class 的成员
Cannot Access Members of Derived Class with shared_ptr of BaseClass
我尝试使用 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
class 的成员(我的研究表明我'我会遇到与功能相同的问题)。并且使用 dynamic_pointer_cast
似乎不起作用。我该怎么做才能访问 Derived
class 的所有成员?
dynamic_pointer_cast
依赖于 dynamic_cast
才能正常工作。如果 dynamic_cast
不起作用,dynamic_pointer_cast
也不起作用。
在您的情况下,dynamic_cast
将不起作用,因为 Base
没有任何 virtual
成员函数。向Base
添加一个virtual
成员函数,或者使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
};
我尝试使用 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
class 的成员(我的研究表明我'我会遇到与功能相同的问题)。并且使用 dynamic_pointer_cast
似乎不起作用。我该怎么做才能访问 Derived
class 的所有成员?
dynamic_pointer_cast
依赖于 dynamic_cast
才能正常工作。如果 dynamic_cast
不起作用,dynamic_pointer_cast
也不起作用。
在您的情况下,dynamic_cast
将不起作用,因为 Base
没有任何 virtual
成员函数。向Base
添加一个virtual
成员函数,或者使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
};