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
派生类继承基类,而不是周围的其他方式的成员。
Base* basepointer = new Derived;
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer
请注意,您需要将自己的遗产改变为public
第一:
class Derived : public Base
但是,如果你的basepointer
指着的Derived
一个实例,那么你可以通过投访问
不应该使用dynamic_cast而不是static_cast? – 2010-03-12 22:09:05
这取决于他是否知道它是否是“派生的”。如果你100%确定(因为我们在这里),那么'static_cast'很好。 – 2010-03-12 22:14:18
并不是每个人都意味着reinterpret_cast而不是static_cast?我很确定static_cast不会编译。 – Balk 2012-03-16 14:42:45
你在这里的雷区上跳舞。基类永远不会知道它实际上是派生的实例。要做到这一点,最安全的方法是在基础引入虚函数:
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点,其他的是一个派生出来的,你的程序将死可怕,这是预期的结果。
或者,您可以使用dynamic_cast(basepointer)。但是你至少需要一个基本的虚拟功能,并且准备遇到一个零。
static_cast <>正如一些人所暗示的那样,这是一种在脚下自我射击的好方法。不要为“C语言家族的不安全”恐怖故事大量缓存作出贡献。
“或者,你可以使用dynamic_cast的(basepointer),但至少需要一个虚函数的基础是什么,以及准备遇到一个零。” - >好点Seva.Liked它:) – mahesh 2010-04-16 08:58:20
使用'static_cast'是不拍自己的脚的方式。我认为你用C的明确演员记法'(T)x'来混淆它。另一方面'static_cast'是类型安全的,但'dynamic_cast'将返回一个空指针,如果它无法转换,而'static_cast'将发出编译器错误。 – 0x499602D2 2015-06-07 21:06:00
可以使用CRTP
你基本上使用的派生类中的模板基类
它是通过让基类可能知道派生类的类型。这可以通过将基类作为派生类型的模板来完成。这个C++习惯用语叫做curiously recurring template pattern。
了解派生类,基类指针可以静态转换为派生类型的指针。
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;
//然后你可以使用派生指针访问派生类
- 1. 从基类指针访问派生类成员
- 2. 从基类指针访问派生类函数时出错
- 3. C++ dynamic_cast基类指向派生类指针的指针
- 4. 在目标c中指派派生类的基类指针
- 5. C++派生类的剧组成员指针到基类指针
- 6. C++派生类访问基类成员
- 7. 访问派生类通过指针
- 8. 从派生类访问基类函数
- 9. D指针/ pimpl模式基类指针访问派生类成员
- 10. C++从派生类指针获取基类对象?
- 11. 将指针基类转换为指向派生类的指针
- 12. 指向派生类对象的基类指针可以访问在派生类中声明的新成员吗?
- 13. 何时使用派生类指针和基类指针
- 14. 将基类指针转换为未知的派生类指针
- 15. 派生类和基类之间指针指针的转换?
- 16. 通过基指针获取派生类?
- 17. 从C#中的基类访问派生类的属性#
- 18. 从派生类c访问基类(列表)属性#
- 19. 派生类访问的基类 - 如何?
- 20. 访问从基类指针派生的私有成员函数派生类对象
- 21. C++删除派生类被分配给所述基类的指针的指针
- 22. C++ - 通过智能指针派生类
- 23. C++ - 派生类到基类
- 24. C#继承。从基类派生类
- 25. C++多态 - 使用基址指针访问派生函数
- 26. 访问派生类
- 27. 如何调用通过基类指针基类方法指向派生类
- 28. 从基类INITIALISE派生类
- 29. 我不能从指针指向派生类的指针和指向基类的指针吗?
- 30. 访问基类构件内派生
你真的想要使用私有继承吗? – 2010-03-12 21:53:23
有人给它添加一个语句终止符,我只改变一个字符。 – 2011-04-16 13:25:48