C++ 有哪些严酷的例子表明C风格的演员阵容不好?
最近我发现了一个很好的例子,说明了为什么C风格的类型转换是不好的。我们从以下实现多个COM接口的类开始(为了简洁起见,我有两个,但在现实生活中可能有十个): 上面的实现使用C-cast来实现。它们甚至可以作为C++ 有哪些严酷的例子表明C风格的演员阵容不好?,c++,casting,C++,Casting,最近我发现了一个很好的例子,说明了为什么C风格的类型转换是不好的。我们从以下实现多个COM接口的类开始(为了简洁起见,我有两个,但在现实生活中可能有十个): 上面的实现使用C-cast来实现。它们甚至可以作为static\u casts-此指针值将得到适当调整 现在我们将相同的QueryInterface()实现复制粘贴(或者我应该说重用代码?)到其他一些非常类似的类 class CMyClassModified : public IInterface1 { //declarations
static\u cast
s-此指针值将得到适当调整
现在我们将相同的QueryInterface()
实现复制粘贴(或者我应该说重用代码?)到其他一些非常类似的类
class CMyClassModified : public IInterface1 {
//declarations omitted
};
并保持实现不变。新类不再从IInterface2
继承,而是
} else if( iid == __uuidof(IInterface2) ) {
*ppv = (IInterface2*)this;
}
将很好地编译,C风格的cast将充当重新解释\u cast
-此
指针值将被复制而不改变调用者将获得一个指向一个对象的指针,该对象实际上没有实现IInterface2
-直接指向未定义的行为。这样的问题在一个巨大的数据库中很难发现,并且当有很多(不是我的示例中的两个)接口时
如果使用了static\u cast
,则不会发生这种情况-编译器将在尝试编译时发出错误
*ppv = static_cast<IInterface2*>(this);
*ppv=static\u cast(本);
在我看来,这是一个非常严酷的例子,说明了使用C风格的强制转换会导致严重的问题
还有什么其他的例子呢?总结了c-cast不好的原因
任何c-cast都可能是一颗炸弹,因为它们通过使编译器静音来隐藏转换警告和错误
既然你想要一个例子,这里是:
int main()
{
float a = 0.123;
double *b = ( double* ) &a;
*b = 0.123;
}
一个非常简单的例子:
class ClassB;//only forward declaration, no real declaration included
Class A * a;
Class B * b;
a = (ClassA *)b;
如果只有ClassB的前向声明,则演员阵容将总是默默地成功。它不在乎ClassB是否派生自ClassA。
如果ClassB不仅仅是从ClassA派生的,那么它也是错误的:
class ClassB:public SomeOtherClass, public ClassA {};
很好,但我不完全确定这是否适合这样做。这似乎很有争议。最多是社区wiki。@腾腾:我不知道这里可以讨论什么——只是在C++中用腿射击自己的例子。@夏普,但这不是问题,是吗?@ Hmm.。我问还有什么其他的例子。这不是一个问题吗?这也可以作为一个例子,说明为什么复制粘贴代码(尤其是在没有彻底阅读的情况下)通常是一个坏主意。这是一个很好的常见问题解答,但它是关于一般的类型转换,而不是关于具体的C-casts。@Sharptoth我想你是对的。然而,每一个象征主义的C++编码风格指南都会告诉你不要使用C样式的演员表。
class ClassB:public SomeOtherClass, public ClassA {};