似乎在if语句中声明的变量泄漏到以下语句?
我复制粘贴了一些代码,令我惊讶的是它编译时,它应该没有! 我准备提交代码并且在此之前我抓住了错误。下面是一个显示问题的工作(?)程序。
以下代码段调用不存在的对象上的函数:
#include <iostream>
class A {
public:
virtual ~A() {}
};
class B : public A {
public:
void fooB() { std::cout << "fooB\n"; }
};
class C : public A {
public:
void fooC() { std::cout << "fooC\n"; }
};
int main() {
A* a = new C();
if (B* b = dynamic_cast<B*>(a)) {
b->fooB();
} else if (C* c = dynamic_cast<C*>(a)) {
c->fooC();
b->fooB();
}
return 0;
}
它编译并输出如下:
fooC
fooB
这肯定是错的。我是否需要启用一些警告以防止编译此代码?
如果我试图访问某些成员变量或调用虚函数,想象一下恐怖!
VS2008和GCC 4.8
中的行为相同答案 0 :(得分:6)
它确实存在,但b
在NULL
分支上是else
,并且在其上调用函数是未定义的行为。