我遇到了虚拟方法的问题。当我致电f
时,它无效。为什么呢?
#include <iostream>
struct A {
virtual void f() const { std::cout << "In A"; }
virtual ~A() {};
};
struct B : A {
void f() const { std::cout << "In B"; }
};
int main()
{
A* a = new A();
B* b = dynamic_cast<B*>(a);
(*b).f();
delete a;
}
它根本不打印任何内容,我也没有任何错误。我做错了什么?
答案 0 :(得分:10)
有什么问题,你没有检查重新调整的指针是否为NULL
。
dynamic_cast
告诉您a
指向的实际对象是否属于b
类型,显然不是。在这种情况下,它会返回NULL
。
基本上,您正在取消引用NULL
指针,导致未定义行为,这对您来说不会崩溃。
使用语言提供的功能时,应按照标准规定的方式使用。使用dynamic_cast
保证对返回的指针进行NULL
检查。
您的指针a
实际上应该指向派生类对象b
。你需要:
A* a = new B();
B* b = dynamic_cast<B*>(a);
此外,您的代码必须检查返回的指针:
if(b != NULL)
(*b).f();
答案 1 :(得分:7)
这一行:
B* b = dynamic_cast<B*>(a);
给出一个空指针,因为a
实际上并不指向B
。
以下行是Undefined Behavior。 (你很“幸运”,什么都没发生。)