C++ 在多态对象上使用静态_强制转换是否表示存在设计缺陷?

C++ 在多态对象上使用静态_强制转换是否表示存在设计缺陷?,c++,C++,我知道应该避免动态_cast,但假设我的程序中有一个类Base的对象x,我知道在执行过程中的某个点,它也是从Base继承的类派生的对象。为了调用派生方法等,可以使用static_cast到downcast吗。?或者这是否表明存在设计缺陷?是的,这可能表明存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?是的,它可能表示存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?它表明了与使用dynamic_cast完全相同的设计缺陷。事实上,如果您使用一个指向基

我知道应该避免动态_cast,但假设我的程序中有一个类Base的对象x,我知道在执行过程中的某个点,它也是从Base继承的类派生的对象。为了调用派生方法等,可以使用static_cast到downcast吗。?或者这是否表明存在设计缺陷?

是的,这可能表明存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?

是的,它可能表示存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?

它表明了与使用dynamic_cast完全相同的设计缺陷。事实上,如果您使用一个指向基类的指针,这应该意味着您只使用传递的对象,就好像它们是基类一样。如果必须确定对象的动态派生类型,则可能不应该使用指向base的指针

使用静态\u cast比使用动态\u cast更危险。只有当您要转换的类型确实正确时,您才具有定义良好的行为。有了一个动态的演员阵容,至少它会告诉你,如果不是


正如任何建议一样,总会有例外。只要问问自己,基本指针类型是否真的适合这里。我们用多态性来表示我们只想要水果!我不管是苹果还是香蕉,我们都会一视同仁!如果您没有像对待基本类型一样对待所有对象,那么您可能需要重新思考。正如Mark Ransom在其回答中给出的一个例子,有时您确实希望以这种方式进行向下转换。

这表明了与使用dynamic_cast完全相同的设计缺陷。事实上,如果您使用一个指向基类的指针,这应该意味着您只使用传递的对象,就好像它们是基类一样。如果必须确定对象的动态派生类型,则可能不应该使用指向base的指针

使用静态\u cast比使用动态\u cast更危险。只有当您要转换的类型确实正确时,您才具有定义良好的行为。有了一个动态的演员阵容,至少它会告诉你,如果不是


正如任何建议一样,总会有例外。只要问问自己,基本指针类型是否真的适合这里。我们用多态性来表示我们只想要水果!我不管是苹果还是香蕉,我们都会一视同仁!如果您没有像对待基本类型一样对待所有对象,那么您可能需要重新思考。正如马克·兰瑟姆(Mark Ransom)在其回答中给出的一个例子,有时你真的想用这种方式来贬低他人。

它有合法的用途。没有它就不可能实现这一目标。

它有合法的用途。如果没有它,这是不可能的。

你能举个例子吗?您通常会向下转换指针或引用。您没有两种类型的对象。应该避免使用dynamic_cast是一个愚蠢的建议,因为像这样的绝对语句都有合法的用例。有时您必须这样做,但是的,它通常表明,如果不是设计缺陷,至少是次优的design@MatteoItalia当然这类建议通常应加前缀。一般来说,使用dynamic_cast表示程序中存在设计缺陷,应该有很好的理由这样做。然而,我认为,我们应该教导人们不要将这种建议视为绝对的。使用static_cast to downcast调用派生方法等是否可以接受。?是的,当然,只要你确信它实际上是派生的。你能举个例子吗?您通常会向下转换指针或引用。您没有两种类型的对象。应该避免使用dynamic_cast是一个愚蠢的建议,因为像这样的绝对语句都有合法的用例。有时您必须这样做,但是的,它通常表明,如果不是设计缺陷,至少是次优的design@MatteoItalia当然这类建议通常应加前缀。一般来说,使用dynamic_cast表示程序中存在设计缺陷,应该有很好的理由这样做。然而,我认为,我们应该教导人们不要将这种建议视为绝对的。使用static_cast to downcast调用派生方法等是否可以接受。?是的,当然可以,只要你确信它实际上是派生的。这是一个很好的例子,说明你确实知道对象的派生类型,除非它滥用了CRTP。static_assert std::is_base_of,CRTP使用不正确;这是一个很好的例子,当你确实知道对象的派生类型时,除非它滥用了CRTP.static\u assert std::is\u base\u ofte_Name>,CRTP使用不正确;真的很确定,谢谢。这很有道理。我正在用MPI编写一个并行代码,其中一些处理器比其他处理器存储更多关于某些对象的信息,因此,派生类。但是在并行代码中,每个人都必须执行相同的代码,因此我将传入基类,并使用if语句来确定稍后代码的行为。我可以看出这有多可疑,我会重新考虑这一点。另一个例外是为了优化目的而使用static_cast和final。您有一个抽象接口,有时您将连续调用其中的许多虚拟函数。通过向下转换到选定的具体类型,然后调用最终的虚拟方法,可以消除虚拟方法调用开销,甚至可以完全省略调用,同时保持调用完全通用,并对库用户隐藏这些优化。我相信你会用这个技巧。谢谢。这很有道理。我正在用MPI编写一个并行代码,其中一些处理器比其他处理器存储更多关于某些对象的信息,因此,派生类。但是在并行代码中,每个人都必须执行相同的代码,因此我将传入基类,并使用if语句来确定稍后代码的行为。我可以看出这有多可疑,我会重新考虑这一点。另一个例外是为了优化目的而使用static_cast和final。您有一个抽象接口,有时您将连续调用其中的许多虚拟函数。通过向下转换到选定的具体类型,然后调用最终的虚拟方法,可以消除虚拟方法调用开销,甚至可以完全省略调用,同时保持调用完全通用,并对库用户隐藏这些优化。我相信他使用了这种技术。