在向上转换时隐式转换与static_cast

时间:2015-10-28 12:54:31

标签: 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
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);

因此,就清晰度(代码风格)而言,在安全性方面,哪一个更好?我知道static_cast更容易搜索,但在这种情况下,隐式转换就足够了。

2 个答案:

答案 0 :(得分:7)

你不必static_cast到基类,static_cast是朝另一个方向走。所以这很好

myList.push_back(objB);
myList.push_back(objC);

您需要static_cast的时间是将A*转换为派生类B*

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

答案 1 :(得分:1)

我希望通过非常通用的解决方案扩展已提供的答案。

永远不要显式地转换编译器已经为你隐式投射的内容。

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

人类会犯错误。永远不要明确地执行编译器已经为您做的事情。

......虽然在一些非常模糊的特殊情况下这可能会引起争议。前一句应该始终适用。

明确施放多余只是违反DRY原则,更重要的是,将来会引发人为错误和混淆。

因此,请避免明确地投射任何不需要它的东西。明确的演员阵容是一种武器:不必要地过度炫耀他们,并且有人会受到伤害。