当Derived仅添加方法时,将指针强制转换为派生指针的有效性

时间:2013-03-10 22:12:38

标签: c++ inheritance extend downcast

首先,问题非常相似 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一样正常。所以我的问题是安全/有效吗?与任何编译器或架构?如果没有,为什么?

解释为什么这个问题,这里是背景。

  • 我有“基础”对象。
  • 我无法修改基类
  • 我有一组模板化函数需要相同的接口 作为基础,除了一些附加功能。
  • 我希望能够将这个模板化的库与我的Base对象一起使用
  • 由于附加功能,以上是不可能的。但 从Base。
  • 实现这些功能是微不足道的
  • 此外,我希望尽可能高效(避免转换和 间接寻址)

因此,如果上述技巧有效,那么它可能是一个很好的解决方案......但也许有更好的设计来解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是未定义的行为。是否"工作"或者不在任何给定的编译器上可能除此之外;你不能完全依赖这项工作。 *

在您所描述的场景中,听起来最好的解决方案就是创建一些以Base为参数的自由函数。当然,如果所需的功能依赖于protected成员,那么您就遇到了问题! (而且我不确定这是一个很好的解决方案,除了找到避免需要这种访问的方法。)

<小时/> *即使你永远不改变你的编译器,这也是正确的。编译器可以自由地假设所有代码都是&#34;正确&#34;,因此对代码的轻微更改可能会触发优化,导致上述技巧无效。

(当然,我并不是说这会肯定发生,只是可以。)