c++ - 向上转换时的隐式转换与 static_cast

标签 c++ casting coding-style upcasting

假设我有三个类:A(母亲,抽象),B 和 C,A 的 child 。

所以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 更容易搜索,但在这种情况下,隐式转换就足够了。

最佳答案

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

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

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

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

关于c++ - 向上转换时的隐式转换与 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33391629/

相关文章:

c++ - 使用字符串来描述函数参数

c++ - 在哪里实现哈希函数?

java - 如何将 java 对象转换为任意其他类型

c# - 如何在 C# 上将内置结构转换为参数类型 T?

java - 在Java中,变量应该在函数的顶部声明,还是在需要时声明?

c++ - 对象生存期内 `this`指针的值是否恒定?

c - 先前的隐式声明 : (casting int to unsigned long)

java - 我应该总是使用泛型吗?

c++ - 这种风格好吗?

c# - 如何从 C# 访问将指针作为输入参数的 C++ 函数