具有继承的 C++ 动态转换
C++ dynamic cast with inheritance
#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" !!!!!
}
'dynamic_cast'不改变ab的静态类型吗?我的意思是,从逻辑上讲,它相当于 B* ab = new B;因为铸造..但它没有。
我认为动态转换会改变对象的静态类型,我错了吗?如果是这样,有什么区别:
A* ab = dynamic_cast<B*>(new B);
和
A* ab = new B;
谢谢
你正在 dynamic_cast
ing 到 B,但是在分配给 ab 时,你 隐含地 转换回 A,所以 dynamic_cast 得到又输了
ab指向的对象的实际类型仍然是B,但是访问对象的指针是A类型,所以选择A::foo。不过,如果 foo 是虚拟的,情况会有所不同。
如果您从 A 指针调用 foo() 函数,将调用 class A 的 foo()。我相信您正在寻找虚拟行为。
如果是这种情况,请将 class A 的 foo() 声明为:
virtual void foo() { cout << "foo in A" << endl; }
#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" !!!!!
}
'dynamic_cast'不改变ab的静态类型吗?我的意思是,从逻辑上讲,它相当于 B* ab = new B;因为铸造..但它没有。
我认为动态转换会改变对象的静态类型,我错了吗?如果是这样,有什么区别:
A* ab = dynamic_cast<B*>(new B);
和
A* ab = new B;
谢谢
你正在 dynamic_cast
ing 到 B,但是在分配给 ab 时,你 隐含地 转换回 A,所以 dynamic_cast 得到又输了
ab指向的对象的实际类型仍然是B,但是访问对象的指针是A类型,所以选择A::foo。不过,如果 foo 是虚拟的,情况会有所不同。
如果您从 A 指针调用 foo() 函数,将调用 class A 的 foo()。我相信您正在寻找虚拟行为。 如果是这种情况,请将 class A 的 foo() 声明为:
virtual void foo() { cout << "foo in A" << endl; }