gpt4 book ai didi

c++ - 将基类的实例向下转换为派生类

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:51 25 4
gpt4 key购买 nike

我感兴趣的是,在特定条件下将基类的实例DOWNCAST(感谢 Mike)到派生类。我认为示例是最简单的解释方式:

struct BaseA
{
void foo() const {}
double bar_member;
// no virtuals here
};

struct DerivedA : public BaseA
{
double bar(double z) {bar_member = z;return bar_member;}
// DerivedA does not add ANY member variables to BaseA.
// It also does not introduce ANY virtual functions.
};

struct BaseB
{
BaseA baseA;
};

// add extra functionality to B, to do this,
// i also need more functionality on baseA.
struct DerivedB : public BaseB
{
// is this "safe"? since BaseA and DerivedA
// should have the same memory layout?!?
DerivedA& getA() {return *static_cast<DerivedA*>(&baseA);}

double foo(double z) {return getA().bar(z);}
};

#include <iostream>

int main(int argc, char** argv)
{
DerivedB b;
// compiles and prints expected result
std::cout << b.foo(argc) << std::endl;
}

在我的例子中,类 BaseA 和 BaseB 实现了某种 View 概念。但是,它们还包含在派生类中添加更多功能所需的所有数据成员。我知道我可以实现 View 以仅保存对提供功能的类的引用。但是,这会带来一些缺点:

  • 我需要重写 View 类的整个接口(interface)。
  • 在我的例子中,派生类拥有一个额外的模板参数(回调类型),我想在 View 中删除它。因此, View 不得持有对提供功能的类的直接引用。

我测试了我的代码,它有效,但是,我并不真的相信这种方法。是的,我知道我可以通过虚拟等实现其中的一些,但它真的性能至关重要...

欢迎任何想法、提示

马丁

致感兴趣的人:我通过以下方式更改了我的设计:

struct DerivedB : public BaseB
{
// encapsule the required extended functionality of BaseA member
struct OperateOnBaseA
{
OperateOnBaseA(BaseA& a);
double dosomething(double);
};

OperateOnBaseA a_extension;

DerivedB() :a_extension(baseA) {}

double foo(double z) {return a_extension.dosomething();}
};

最佳答案

至于技术方面:2011 年标准 5.2.9.11 静态强制转换当然是禁止的。令 B 为 D 的基数:

If the prvalue of type “pointer to cv1 B” points to a B that is actually a subobject of an object of type D, the resulting pointer points to the enclosing object of type D. Otherwise, the result of the cast is undefined.

另一方面,如果有人能找到一个不只是这样做的实现,我会感到惊讶,因为类、方法和静态转换的明显实现。

关于c++ - 将基类的实例向下转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22475615/

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