Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有哪些严酷的例子表明C风格的演员阵容不好?_C++_Casting - Fatal编程技术网

C++ 有哪些严酷的例子表明C风格的演员阵容不好?

C++ 有哪些严酷的例子表明C风格的演员阵容不好?,c++,casting,C++,Casting,最近我发现了一个很好的例子,说明了为什么C风格的类型转换是不好的。我们从以下实现多个COM接口的类开始(为了简洁起见,我有两个,但在现实生活中可能有十个): 上面的实现使用C-cast来实现。它们甚至可以作为static\u casts-此指针值将得到适当调整 现在我们将相同的QueryInterface()实现复制粘贴(或者我应该说重用代码?)到其他一些非常类似的类 class CMyClassModified : public IInterface1 { //declarations

最近我发现了一个很好的例子,说明了为什么C风格的类型转换是不好的。我们从以下实现多个COM接口的类开始(为了简洁起见,我有两个,但在现实生活中可能有十个):

上面的实现使用C-cast来实现。它们甚至可以作为
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 {};