我dynamic_cast对C++中的关键字很困惑.
struct A {
virtual void f() { }
};
struct B : public A { };
struct C { };
void f () {
A a;
B b;
A* ap = &b;
B* b1 = dynamic_cast<B*> (&a); // NULL, because 'a' is not a 'B'
B* b2 = dynamic_cast<B*> (ap); // 'b'
C* c = dynamic_cast<C*> (ap); // NULL.
A& ar = dynamic_cast<A&> (*ap); // Ok.
B& br = dynamic_cast<B&> (*ap); // Ok.
C& cr = dynamic_cast<C&> …Run Code Online (Sandbox Code Playgroud) 考虑这个简单的层次
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
Run Code Online (Sandbox Code Playgroud)
试图向下转换Base* p到Derived*可能使用dynamic_cast<Derived*>(p).我曾经dynamic_cast通过将vtable指针p与Derived对象中的指针进行比较来思考作品.
但是,如果我们从中衍生出另一个类Derived呢?我们现在有:
class Derived2 : public Derived { };
Run Code Online (Sandbox Code Playgroud)
在这种情况下:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
Run Code Online (Sandbox Code Playgroud)
我们仍然得到一个成功的向下转换,即使vtable指针in Derived2与vtable指针无关Derived.
它是如何实际工作的?如何dynamic_cast知道是否Derived2派生自Derived(如果Derived在不同的库中声明的话)?
我正在寻找关于它如何实际工作的具体细节(最好是在海湾合作委员会,但其他人也很好).这个问题是不是一个重复这个问题(没有指明它是如何工作).
任何人都可以给我一个真实世界的例子,说明当需要dynamic_cast并且根本无法解决时?我能想到的例子通常可以解决双重调度问题.
如果约束太强,那么一般来说,dynamic_cast的示例也很好.
我希望看到真实的例子,而不是"它通常用于在类型树之间向上和向下转换".
基本上我只想使用任意类型的给定参数进行任意操作.
参数类型基类是Var,而Operation是将为给定参数执行的操作的基类.
我有Evaluator类,它包含使用opId映射的运算符集合.Evaluator将根据evaluate()成员函数中给出的opId参数进行操作,然后evaluate()函数将搜索将接受参数类型和opId的受支持运算符.
我想问的是,有没有有效的模式或算法可以在没有dynamic_cast <>和/或循环运算符集合的情况下执行此操作.
`
class Var {
public:
bool isValidVar();
static Var invalidVar();
}
template<typename T> class VarT : public Var {
public:
virtual const T getValue() const;
}
class Operator {
public:
virtual Var evaluate(const Var& a, const Var& b) = 0;
}
template<typename T> class AddOperator : public Operator {
public:
virtual Var evaluate(const Var& a, const Var& b)
{ //dynamic_cast is slow!
const VarT<T>* varA = dynamic_cast<const VarT<T>*>(&a);
const …Run Code Online (Sandbox Code Playgroud)