在C ++中,是否允许强制转换为仅添加非虚方法的派生类?

时间:2016-03-20 21:15:11

标签: c++ oop inheritance casting

我想将非虚拟方法添加到我无法更改的现有类A中。因此,我创建了一个继承自B的类A并添加了我想要的方法。现在,如果我有A类型的对象,我可以将它视为B类型的对象吗?说,以下代码是否合法?:

class A { <...> };

class B: public A {
    void f();
  };

A a();
void g( const B& );
void h() { g( static_cast<B&&>(a()) ); }

它确实可以编译和工作,但我想知道标准是否能保证按预期工作。我不明白为什么不,但感觉不是很干净..

1 个答案:

答案 0 :(得分:5)

这是未定义的行为。来自[expr.static.cast]

  

类型为“cv1 B”的左值,其中B是类类型,可以强制转换为类型“引用cv2 D”,其中D是类   从B得出(第10条),如果存在从“指向D的指针”到“指向B的指针”的有效标准转换(4.10),   cv2与cv1具有相同的cv资格,或者比cv1更高的cv资格,并且B既不是虚拟基类   D也不是D的虚基类的基类。结果具有类型“cv2 D”。一个类型为“cv1 B”的x值   可以使用与“cv1 B”类型的左值相同的约束来强制转换为“对cv2 D的rvalue引用”。   如果类型为“cv1 B”的对象实际上是D类型对象的子对象,则结果是指封闭的对象   类型为D.的对象。否则,行为未定义。

a实际上并不是B类型对象的子对象 - 它实际上只是类型A,因此行为未定义。

阻止您简单添加非成员函数的原因是什么:

void f(A& ); 

如果答案是您需要访问private的{​​{1}}或protected成员,则有意让您无法访问这些成员!