在代码中用C ++向上转换的原因是什么?这些代码将用于对大量数据(我正在使用的库)进行数值计算?
考虑以下层次结构:
template<class T>
class unallocatedArray
{
public:
unallocatedArray(int size, T t)
: size_(size), t_(0)
{
}
// Copy constructor. This is the only way to
// actually allocate data: if the array is
// passed as an argument to the copy constr.
// together with the size.
// Checks. Access operators. Iterators, etc.
// Wrappers for stl sorts...
private:
int size_;
T* t_;
};
template<class T>
class myArray
: public unallocatedArray<T>
{
public:
// This type actually allocates the memory.
myArray (int size)
: unallocatedArray<T>(size)
{
// Check if size < 0..
// Allocate.
this->t_ = new T[size];
}
myArray (int size, T t)
{
this->t_ = new T[size];
for (int i = 0; i < this->size_; i ++ )
{
this->t_[i] = t;
}
}
// Some additional stuff such as bound checking and error handling.
// Append another array (resizing and memory copies), equality
// operators, stream operators, etc...
};
template<class T>
class myField
: public myArray<T>
{
public:
// Constructors call the parent ones. No special attributes added.
// Maping operations, arithmetical operators, access operator.
};
//
template<class T>
class geomField
: public myField<T>
{
// myField but mapped on some kind of geometry, like surface meshes,
// volume meshes, etc.
};
这只是一个非常简化的模型,只是声明访问运算符是一直定义的,并且算术运算符放在myField类中。现在,将geomField向上转换为myField的原因是什么,如果需要执行以下1e07次:
访问该元素 执行算术表达
以下列方式:
GeomField<myType> geomFieldObject;
myField<myType>& downCast = geomFieldObject;
// Do the arithmetical operations on the downCast reference.
这两个领域?是不是也在向上引入某种惩罚?算术运算符是否不公开给geomField:这不是公共继承的全部意义吗?
我没有设计这个,它来自我正在开发的os库。:)
谢谢!
答案 0 :(得分:1)
我只能猜测,但是为了实现几何映射,可能会在geomField
中覆盖一些算术运算。
如果您在geomField
中有数据但想要执行未映射的操作,则可能是向上转发的原因。
另一方面,如果在geomField
中没有覆盖在铸造参考上执行的任何操作,那么你就没有必要进行铸造。
通常,向上转换不会引入任何性能缺陷,因为通常(或者甚至在每种情况下,我现在都不确定......)它完全在编译时完成:考虑以下类:
class A {
public:
void f();
};
class B : public A {
public:
void f(); // Overwrites A::f
};
当您的代码看起来像
时B obj;
obj.f();
它被编译器翻译成类似
的东西B::f(&obj);
和
static_cast<A>(obj).f();
结果
A::f(&obj);
即。没有通过强制转换引入的运行时开销。