在C++中,如果没有dynamic_cast,我怎么能将一个子类实例从一个基类指针转换到另一个基类
In C++ how could I cast a sub class instance from one base class pointer to another without dynamic_cast?
我想在没有dynamic_cast
:的情况下完成此操作
class A {};
class B {};
class C : public A, public B {};
void func()
{
A* pClassA = new C();
B* pClassB = what_cast<B*>(pClassA); // what could the cast be?
}
我认为ClassC
类型的实例可以表示为ClassA
和ClassB
。现在,如果我只能得到类型为ClassA
的指针,那么在没有dynamic_cast
的情况下,我如何将其转换为ClassB
?
A
和B
是不相关的类型,因此不能在它们之间进行强制转换。只要确定pClassA
指向C
,就可以对C*
进行中间转换,然后依靠隐式派生到基的转换来获得B*
:
B* pClassB = static_cast<C*>(pClassA);
或者,您可以通过C*
显式强制转换为B*
:
B* pClassB = static_cast<B*>(static_cast<C*>(pClassA));
在设计良好的代码中,这种类型的问题几乎不会发生。所以,最好重新考虑你的设计。也许你想避免多态性,当你真的应该使用它的时候?你可以
struct B; // forward decl
struct A {
virtual B*this_as_B_ptr() { return nullptr; }
const B*this_as_B_ptr() const { return const_cast<A*>(this)->this_as_B_ptr(); }
virtual~A() {}
};
struct B { /* ... */ }; // may be in different header
struct C:A,B // may be in yet different header
{
B*this_as_B_ptr() override { return this; }
};
A* pA = new C;
B* pB = pA->this_as_B_ptr();
--有效地实现了更高效的动态铸造方式。
您可以使用一些强制转换将pClassA
强制转换为B*
,包括reinterpret_cast
和C样式强制转换。
你真正的问题是"在没有dynamic_cast
的情况下,我如何安全地投射。好吧,尽管你可以做所有类型的对象验证机制,但我怀疑你是否真的需要它们。
dynamic_cast
出了什么问题?
编辑: 嗯。我更喜欢习语C++而不是技巧,但有时你确实需要原始大小/速度。我会选择一些标记机制:
enum Types{AType,BType,CType};
struct A {
int type;
A(): type(AType) {}
bool is (Types wantedType) {return (type & wantedType) == wantedType; }
};
struct B {
};
struct C : public A, public B {
C(){ type = (type | CType) | BType ; }
};
通过这种方式,您可以静态地询问对象是否来自类型Types
实际运行:http://coliru.stacked-crooked.com/a/1774f9c85603fa31
相关文章:
- C++多态性:如何测试一个类是否派生自另一个基类
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 如果我们有一个基*类,如何访问派生模板类的成员函数
- 使从一个基类派生的类能够使用继承的受保护成员
- 如果未实现虚函数,则大多数派生类无法编译,但如果一个基类未实现虚函数,则可以编译
- 为什么将好奇模板模式的基类直接转换为另一个基类是错误的?
- C :从一个基础到另一个基类模板的动态铸造
- 从抽象基类访问另一个基类成员
- 为什么我的一个基类构造函数被删除了?(C++11).
- 创建一个基类,该基类为派生类实现单一实例
- c++抽象类在另一个基类中的实现
- 使用一个基类进行多重继承
- 如何重写另一个基类中的函数
- 虚拟继承:当只有一个基类具有"虚拟"关键字时,为什么它有效?有没有更好的方法?
- 从一个基类的指针对另一个基类的多重继承和泛型访问
- 如果一个基类有2个派生类,并且这些类每个都有一个派生类.那么我可以为大多数派生类扩展一个基方法*一次*吗
- 是否有可能有一个基类方法来调用它的所有派生类的相同(但被重写的方法)?
- 在C++中,如果没有dynamic_cast,我怎么能将一个子类实例从一个基类指针转换到另一个基类
- 对所有异常使用一个基类的缺点是什么?
- 如何在多重继承下从一个基类继承所有类型