从基类指针C ++访问派生类成员
-
19-09-2019 - |
题
如果我分配一个类Derived
的对象(用碱类Base
的),并存储一个指向在指向基类的一个变量,它的对象,我怎样才能访问Derived
类的成员<? / p>
下面是一个例子:
class Base
{
public:
int base_int;
};
class Derived : public Base
{
public:
int derived_int;
};
Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
解决方案
没有,则不能因为derived_int
是derived_int
的一部分访问Derived
,而basepointer
是Base
一个指针。
您可以做,虽然它倒过来:
Derived* derivedpointer = new Derived;
derivedpointer->base_int; // You can access this just fine
派生类继承的基类,而不是周围的其他方式的成员。
不过,如果你basepointer
指着Derived
的实例,那么你可以通过投访问:
Base* basepointer = new Derived;
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer
请注意,你需要改变你的继承先public
:
class Derived : public Base
其他提示
您在这儿跳舞的雷区。该基类是不会知道它实际上是派生的一个实例。做到这一点的最安全的方法是在基体引入的虚拟功能:
class Base
{
protected:
virtual int &GetInt()
{
//Die horribly
}
public:
int base_int;
};
class Derived : Base
{
int &GetInt()
{
return derived_int;
}
public:
int derived_int
};
basepointer->GetInt() = 0;
如果basepointer
点作为其他东西,一个Derived
,你的程序将可怕死,这是预期的结果。
可替换地,可以使用dynamic_cast<Derived>(basepointer)
。但需要至少一个虚拟函数的Base
为该,并准备遇到零。
在static_cast<>
,像一些建议,是一种肯定的方式来搬起石头砸自己的脚。不要造成的恐怖故事“C语言家族的不安全”的巨大的缓存。
可以使用 CRTP
在基本上使用派生类在模板的基础类
有通过使基类知道派生类的类型是可能的。这可以通过使基类派生类型的模板来完成。这个C ++成语称为奇异递归模板模式
知道了派生类,基础类指针可以是静态铸的指针派生类型。
template<typename DerivedT>
class Base
{
public:
int accessDerivedField()
{
auto derived = static_cast<DerivedT*>(this);
return derived->field;
}
};
class Derived : public Base<Derived>
{
public:
int field;
};
int main()
{
auto obj = new Derived;
obj->accessDerivedField();
}
//如果你知道派生类,你要使用
派生* derivedpointer = dynamic_cast的<派生*> basepointer;
//然后可以访问导出使用derivedpointer类
不隶属于 StackOverflow