这是一些代码:
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;
}
};
如果您假设上述定义无法更改,则可以通过哪些机制调用类型为“const containerC&”类型的myType的“someFunction”方法?
我所能找到的就是从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);
}
};
这样安全吗?我的猜测是,关于如何在someFunction中使用它们,将取决于containerB和containerC的运算符。
所有容器都是模板化的,但这没有什么区别,这是一个继承层次结构问题。
非常重要:由于显式类型转换是使用containerA作为参数为containerB和containerC定义的,因此我可以将containerC作为直接参数传递给myType::someFunction,但是在这种情况下,将进行复制构造,即正是我想要避免的。
一些特定的注意事项:
containerB和containerC的
containerB和containerC并不是两种通用的不同类型:containerC仅添加了一些成员函数,没有更改对象的内部数据。
最佳答案
不,这是不安全的,我认为这属于未定义行为的范围。
类containerB和containerC总共是两种不同的类型(但它们都继承自containerA)。
因此,为containerB和containerC调用someFunction()的唯一“合法”方法是
关于c++ - 使用reinterpret_cast作为成员函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8269648/