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

Yar*_*Tal 2 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()) ); }
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 5

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

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

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

什么阻止你简单地添加一个非成员函数:

void f(A& ); 
Run Code Online (Sandbox Code Playgroud)

如果答案是您需要访问privateprotected成员A,那么有意让您无法访问这些成员!