【问题标题】:Implicit conversion vs. static_cast when upcasting向上转换时的隐式转换与 static_cast
【发布时间】:2015-10-28 12:54:31
【问题描述】:

假设我有三个类: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 更容易搜索,但在这种情况下,隐式转换就足够了。

【问题讨论】:

    标签: c++ casting coding-style upcasting


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是我需要的答案。所以向上转换时没有 static_cast,但向下转换时是的。谢谢! (而且答案非常快!)
    • @fern17 另外,请注意,在向下转换时,您可能并不总是知道它是 B 还是 C。这就是 dynamic_cast 的用途。
    • 是的,我知道了,谢谢你把它说清楚(对于将来会回到这个问题的我)
    【解决方案2】:

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

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

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

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

    ...尽管在一些非常晦涩的例外情况下这可能更具争议性。前一句应该永远成立。

    显式地进行多余的投射只是违反 DRY 原则,更重要的是,会在未来引发人为错误和混乱。

    因此,请避免显式转换任何不需要它的内容。显式施法是一种武器:不必要地过于频繁地炫耀它们,肯定有人会受伤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多