C++ 向上投射时的隐式转换与静态投射

C++ 向上投射时的隐式转换与静态投射,c++,casting,coding-style,upcasting,C++,Casting,Coding Style,Upcasting,假设我有三个班:A(抽象的母亲),B和C,A的孩子 所以B和C继承自A(公共继承)。 我有一个指向a的指针列表,我用B或C的指针填充它 问题是:在进行铸造/转换时,首选哪种样式 class A {}; class B : public A {}; class C : public A {}; B* objB = new B(); C* objC = new C(); std::list<A*> myList; // Option A: static cast conversion

假设我有三个班:A(抽象的母亲),B和C,A的孩子

所以B和C继承自A(公共继承)。 我有一个指向a的指针列表,我用B或C的指针填充它

问题是:在进行铸造/转换时,首选哪种样式

class A {};
class B : public A {};
class C : public A {};

B* objB = new B();
C* objC = new C();

std::list<A*> myList;
// Option A: static cast conversion
myList.push_back(static_cast<A*> (objB));
myList.push_back(static_cast<A*> (objC));

// Option B: implicit conversion
myList.push_back(objB);
myList.push_back(objC);

// Option C: C-style conversion (I understand that this is evil and must be avoided)
myList.push_back((A*) objB);
myList.push_back((A*) objC);
A类{};
B类:公共A{};
C类:公共A{};
B*objB=新的B();
C*objC=新的C();
std::列表myList;
//选项A:静态强制转换
myList.push_back(静态_cast(objB));
myList.push_back(静态_cast(objC));
//选项B:隐式转换
myList.push_back(objB);
myList.push_back(objC);
//选项C:C型转换(我理解这是邪恶的,必须避免)
myList.push_back((A*)objB);
myList.push_back((A*)objC);

那么,在清晰性(代码风格)和安全性方面,哪一个更好?我知道静态强制转换更容易搜索,但在这种情况下,隐式转换就足够了。

您不必将
静态强制转换
到基类,而
静态强制转换
则是朝着另一个方向。所以这很好

myList.push_back(objB);
myList.push_back(objC);
您必须执行的
static\u cast
操作是将
A*
强制转换为派生类
B*

B* some_obj = static_cast<B*>(myList.front());
B*some_obj=static_cast(myList.front());

我想用一个非常通用的解决方案扩展已经提供的答案

永远不要显式地强制转换编译器已经隐式地为您强制转换的内容

我们甚至可以将其进一步概括为:

人类会犯错。永远不要显式地执行编译器已经为您执行的操作

。。。尽管在一些非常模糊的例外情况下,这可能会有点争议。前一句话应始终正确

明确地投下多余的一票只会违反干涸的原则,更重要的是,会在未来引发人为错误和混乱


因此,避免显式地强制转换任何不需要它的内容。显性施放是一种武器:不必要地太频繁地炫耀,肯定会有人受伤。

这就是我需要的答案。所以向上投射时没有静态投射,但向下投射时是。非常感谢。(这是一个非常快速的答案!)@fern17还请注意,当向下播放时,您可能并不总是知道它是B还是C。这就是
dynamic\u cast
的作用。是的,我知道,谢谢您明确地说明(对于未来的我,我将回到这个问题)