首先,问题非常相似 downcasting shared pointer to derived class with additional functionality is,那里有很好的答案。但我想解释为什么这是有效的(或不是)以及何时不使用共享指针。所以:
class Base { /* ... */ };
class Derived : public Base
{
public:
void additionnalFunc(int i){ /* access Base members */ }
};
int main(){
Base b;
Derived* d = (Derived*) &b; // or static_cast ?
d->additionnalFunc(3); // works ok.
}
这与gcc一样正常。所以我的问题是安全/有效吗?与任何编译器或架构?如果没有,为什么?
解释为什么这个问题,这里是背景。
因此,如果上述技巧有效,那么它可能是一个很好的解决方案......但也许有更好的设计来解决这个问题?
答案 0 :(得分:2)
这是未定义的行为。是否"工作"或者不在任何给定的编译器上可能除此之外;你不能完全依赖这项工作。 *
在您所描述的场景中,听起来最好的解决方案就是创建一些以Base
为参数的自由函数。当然,如果所需的功能依赖于protected
成员,那么您就遇到了问题! (而且我不确定这是一个很好的解决方案,除了找到避免需要这种访问的方法。)
<小时/> *即使你永远不改变你的编译器,这也是正确的。编译器可以自由地假设所有代码都是&#34;正确&#34;,因此对代码的轻微更改可能会触发优化,导致上述技巧无效。
(当然,我并不是说这会肯定发生,只是可以。)
子>