static_cast疑问
#include <iostream>
class A
{
public:
A()
{
std::cout << "n A_Constructor t" << this <<std::endl;
}
void A_Method()
{
std::cout <<"n A_Method t" << this <<std::endl;
}
};
class B:public A
{
public:
B()
{
std::cout <<"n B_Constructor n";
}
void B_Method()
{
std::cout <<"n B_Method t" << this <<std::endl;
}
};
int main()
{
A *a_obj = new A;
B *b_obj = static_cast<B*> (a_obj); // This isn't safe.
b_obj->B_Method();
getchar();
return 0;
}
输出:
A_Constructor 001C4890
B_Method 001C4890
由于类型转换不涉及运行时检查,因此static_cast
不安全。但在这个例子中,我得到了我甚至没想到的东西。由于没有调用B::B()
,任何成员都不应该被b_obj
调用。尽管我得到了输出。
在这个简单的例子中,我可能已经成功,虽然它已知不安全。我的疑虑是 -
虽然没有打电话给B::B()
,但我怎么能够访问class B
成员函数。
有人可以提供一个例子,这是不安全的,可能会出错(虽然我之前给出的可能是一个不好的例子,但更好)。
我是在Visual Studio 2010上使用 Wall选项设置的。
没有找到相关结果
已邀请:
3 个回复
混侩闯空坷
掀辟髓观粟
香腔弥胯瓤
的正常函数调用(想想
)。现在,
指向一个错误类型的对象,但又一次,谁在乎呢?它唯一能做的就是打印它,这总是一件安全的事情。 实际上,您甚至可以使用NULL指针调用方法。只要方法不是虚拟的并且不尝试访问
指向的任何内容,它就可以工作。我曾经有过许多程序使用的库。这个库有一个类似单例的类,必须明确构造,但没有一个程序实际上是这样做的。默认情况下,实例指针初始化为NULL,因为它是全局的。由于课程根本没有数据成员,所以它工作得很好。然后我添加了一些,所有程序突然开始崩溃。当我发现原因时,我笑得很开心。我一直在使用一个甚至不存在的对象。