2

首先,这个问题与将共享指针向下转换为具有附加功能的派生类非常相似 ,那里有很好的答案。但是我想解释一下为什么这是有效的(或无效的)以及何时不使用共享指针。所以 :

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 对象一起使用
  • 由于附加功能,以上是不可能的。但是从 Base 实现这些功能是微不足道的。
  • 我也想尽可能高效(避免转换和间接)

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

4

1 回答 1

2

这是未定义的行为。它在任何给定的编译器上是否“有效”可能都不是重点;一般来说,你不能依赖这个工作。*

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


* 即使您从不更改编译器也是如此。编译器可以自由地假设所有代码都是“正确的”,因此对代码的轻微更改可能会触发优化,从而使上述技巧变得无用。

(当然,我不会暗示这肯定会发生,只是它可能会发生。)

于 2013-03-10T22:15:54.780 回答