安全,检查强制转换为C ++基类而不使用额外的行

时间:2014-06-04 00:56:31

标签: c++ casting

说我继承了班级B的班级A,并考虑以下代码:

void f(B& b) {
  A& a = b;
  g(a);
}

有没有办法避免演员的额外线?请注意,以下static_cast版本不等同,因为除了向下转换之外它还允许向上转换:

// Potentially dangerous: doesn't check that B inherits from A
void f(B& b) {
  g(static_cast<A&>(b));
}

编辑:我不能依靠隐式强制来完全避免演员阵容,就像Brian的回答一样。今天的原因是g是模板,我想避免不必要的实例化,但过去还有其他原因可供我使用。在任何情况下,我都需要某种显式转换来获取类型A&的值。

1 个答案:

答案 0 :(得分:6)

如果g有原型

void g(A& a);

然后根本不需要演员阵容;代替

g(b)
只要B确实来自A

就会隐含地将B的左值隐式转换为左A的左值。如果A派生自B,则编译将失败(除非出于某种奇怪的原因,您添加了从BA的用户定义转换...)

编辑:如果您确实需要参数具有类型“左值A”并且希望避免转换为派生类,请考虑{{3 }}