向上转换时隐式转换与static_cast

fer*_*n17 6 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);
Run Code Online (Sandbox Code Playgroud)

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

Cor*_*mer 8

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

myList.push_back(objB);
myList.push_back(objC);
Run Code Online (Sandbox Code Playgroud)

你必须static_cast要做的事情就是把一个东西投射A*到派生类上B*

B* some_obj = static_cast<B*>(myList.front());
Run Code Online (Sandbox Code Playgroud)

  • @fern17 另外,请注意,在向下转换时,您可能并不总是知道它是 B 还是 C。这就是 `dynamic_cast` 的用途。 (2认同)