C++ 在多态对象上使用静态_强制转换是否表示存在设计缺陷?
我知道应该避免动态_cast,但假设我的程序中有一个类Base的对象x,我知道在执行过程中的某个点,它也是从Base继承的类派生的对象。为了调用派生方法等,可以使用static_cast到downcast吗。?或者这是否表明存在设计缺陷?是的,这可能表明存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?是的,它可能表示存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?它表明了与使用dynamic_cast完全相同的设计缺陷。事实上,如果您使用一个指向基类的指针,这应该意味着您只使用传递的对象,就好像它们是基类一样。如果必须确定对象的动态派生类型,则可能不应该使用指向base的指针 使用静态\u cast比使用动态\u cast更危险。只有当您要转换的类型确实正确时,您才具有定义良好的行为。有了一个动态的演员阵容,至少它会告诉你,如果不是C++ 在多态对象上使用静态_强制转换是否表示存在设计缺陷?,c++,C++,我知道应该避免动态_cast,但假设我的程序中有一个类Base的对象x,我知道在执行过程中的某个点,它也是从Base继承的类派生的对象。为了调用派生方法等,可以使用static_cast到downcast吗。?或者这是否表明存在设计缺陷?是的,这可能表明存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?是的,它可能表示存在设计缺陷。如果您知道它是某种类型的派生类,为什么要将其作为基类传递?它表明了与使用dynamic_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