这里的一些代码:使用reinterpret_cast的成员函数的参数
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一个新的类型,并重新定义了“someFunction”使用的reinterpret_cast如下:
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的操作符关于它们在某些函数中的使用方式。
所有容器都是模板化的,但这没什么区别,这是一个继承层次结构问题。
非常重要:由于显式类型转换是为containerB和containerC定义的,因此将containerA作为参数,我可以将containerC作为直接参数传递给myType :: someFunction,但在这种情况下,复制构造发生,这正是我想要避免的。
一些具体说明:既containerB和containerC的
- 属性是完全相同的
- someFunction仅利用opearator []用于访问容器的元件,并且
- 操作者+ =(但此被定义在模板元素级别)
containerB和containerC不是两个通用的不同类型:containerC只是一些添加的成员函数,没有int对象的外部数据被改变。
重载已经超越了我的想法,但有没有一种安全的方式来使用someFunction(containerB)已经定义的代码? – tmaric
如果containerC和containerB具有共同的功能,则应该由containerA中的实现(B和C继承)中的实现来表示,然后可以由一个采用containerA的someFunction来覆盖。如果没有共同的功能,你必须有两个不同的实现。其他一切都很糟糕。 –