我写了几行代码,我觉得不应该编译。我在static_cast-ed指向基类对象的指针上调用派生类的方法,如下所示:
class B {};
class D: public B
{
public:
void bar() { printf("%d\n", m_i); }
private:
int m_i;
};
int main()
{
B b;
D* d = static_cast<D*>(&b);
d->bar();
return 0;
}
打印的价值显然是垃圾,但这应该编译吗? gcc
如何设法做到这一点?
答案 0 :(得分:1)
gcc
不能保证它是不正确的,除非在少数情况下确实不值得检查。当你使用static_cast
时,你会承诺你知道wtf你正在做的编译器。
这里有两种演员表。 static_cast
,也就是说,你告诉编译器指向基址的指针是一个指向派生的指针,然后关闭并继续使用它。 dynamic_cast
,也就是说,你要求编译器检查指向base的指针是否确实是派生的指针。您使用了static_cast
,因此编译器会关闭并按照您的说法执行操作。
编辑:John准确地指出继承层次结构中没有虚函数,您应该从C ++中触发,dynamic_cast
仅对虚函数有效。
答案 1 :(得分:0)
使用static_cast&lt;&gt;你告诉编译器“我知道我在做什么,B *实际上是D *,闭嘴,只是做我说的。”