gpt4 book ai didi

c++ - 对成员函数参数使用 reinterpret_cast

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:41 24 4
gpt4 key购买 nike

这是一些代码:

class containerA
{};

class containerB
: public containerA
{
public:
containerB () {};

containerB(const containerB& cb)
{
cout << "containerB copy ctor" << endl;
}
};

class containerC
: public containerA
{
public:
containerC () {};

containerC(const containerC& cc)
{
cout << "containerC copy ctor" << endl;
}
};

class myType
{
public:

void someFunction(const containerB& cB)
{
cout << "someFunction(containerB)" << endl;
}
};

如果你假设上面的定义不能改变,通过什么机制可以调用myType的“someFunction”方法,参数类型为“const containerC&”?

我所能找到的就是从 myType 公开派生一个新类型,并使用 reinterpret_cast 重新定义“someFunction”,如下所示:

class myTypeNew
: public myType
{
public:
void someFunction(const containerC& cC)
{
cout << "someFunction(containerC)" << endl;

const containerB& cbRef = reinterpret_cast<const containerB&>(cC);

myType::someFunction(cbRef);
}
};

这样安全吗?我的猜测是,这将取决于 containerB 和 containerC 的运算符(operator)如何在 someFunction 中使用它们。

所有的容器都是模板化的,但这没有区别,这是一个继承层次问题。

非常重要:由于显式类型转换是为 containerB 和 containerC 定义的,将 containerA 作为参数,我可以将 containerC 作为直接参数传递给 myType::someFunction,但在这种情况下,会进行复制构造,而这正是我想要避免的。

一些具体说明:

  • containerB和containerC的属性完全一样
  • someFunction 仅使用 opearator[] 来访问容器元素,并且
  • operator+=(但这是在模板元素级别定义的)

containerB和containerC不是一般的两个不同类型:containerC只是增加了一些成员函数,并没有改变对象的内部数据。

最佳答案

不,它不安全,我认为它在未定义行为的范围内。

类 containerB 和 containerC 完全是两种不同的类型(除了它们都继承自 containerA)。

因此,为 containerB 和 containerC 调用 someFunction() 的唯一“合法”方法是

  • 提供覆盖类型的 someFunction 的重载
  • 在基类 containerA 中提供一个 someFunction(containerA& ca) 和足够的接口(interface)

关于c++ - 对成员函数参数使用 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8269648/

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