我想将非虚拟方法添加到我无法更改的现有类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()) ); }
它确实可以编译和工作,但我想知道标准是否能保证按预期工作。我不明白为什么不,但感觉不是很干净..
答案 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
成员,则有意让您无法访问这些成员!