gpt4 book ai didi

c++ - 当 Derived 仅添加方法时,将 Base 指针转换为 Derived 指针的有效性

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:41 27 4
gpt4 key购买 nike

首先,这个问题非常类似于 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 对象一起使用
  • 因为有额外的功能,以上是不可能的。但这些功能很容易从 Base 实现。
  • 我还想尽可能高效(避免转换和间接)

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

最佳答案

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

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


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

(当然,我并不是说这将肯定发生,只是说它可能。)

关于c++ - 当 Derived 仅添加方法时,将 Base 指针转换为 Derived 指针的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15328297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com