让我们说我有三个班级: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更容易搜索,但在这种情况下,隐式转换就足够了。
答案 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原则,更重要的是,将来会引发人为错误和混淆。
因此,请避免明确地投射任何不需要它的东西。明确的演员阵容是一种武器:不必要地过度炫耀他们,并且有人会受到伤害。