#include <iostream>
using namespace std;
class A
{
public:
void foo() { cout << "foo in A" << endl; }
};
class B : public A
{
public:
void foo() { cout << "foo in B" << endl; }
};
int main() {
A* a = new B;
a->foo(); // will print "foo in A" because foo is not virtual
B* b = new B;
b->foo(); // will print "foo in B" because static type of b is B
// the problem
A* ab;
ab = dynamic_cast<B*>(new B);
ab->foo(); // will print "foo in A" !!!!!
}
&#39; dynamic_cast&#39;不改变ab的静态类型?我的意思是,从逻辑上讲,它的接缝相当于B * ab = new B;因为铸造..但它没有。
我以为动态转换会改变对象的静态类型,我错了吗?如果是这样,有什么区别:
A* ab = dynamic_cast<B*>(new B);
和
A* ab = new B;
由于
答案 0 :(得分:1)
你是dynamic_cast
到B,但在分配到ab时,你隐含地回到A,所以dynamic_cast再次丢失。
对象ab的实际类型指向仍然是B,但访问对象的指针是A类型,因此选择了A :: foo。如果foo是虚拟的话会有所不同。
答案 1 :(得分:0)
如果从A指针调用foo()函数,将调用A类的foo()。我相信你正在寻找虚拟行为。 如果是这种情况,请将A类的foo()声明为:
virtual void foo() { cout << "foo in A" << endl; }