Вам нужен редизайн. Во-первых, предпочтение свободных функций над функциями-членами. Единственные функции-члены, которые вы должны иметь, это те, которым нужен доступ для рядовых.
Начните с этой комбинации:
class VectorN
{
public:
virtual VectorN& operator*=(double d)
{
/* ... */
return *this;
};
};
class Vector3 : public VectorN
{
public:
virtual Vector3& operator*=(double d)
{
return static_cast<Vector3&>(VectorN::operator*=(d));
};
};
Здесь ковариация работает нормально, потому что тип является ссылкой или указателем, и вы повторно используете код. (static_cast
является бесплатным, ориентированным на производительность и безопасным, поскольку вы знаете производный тип.)
Затем вы реализуете свои свободные функции:
// optimization: if you're going to make a copy, do it in the parameter list;
// compilers can elide a copy when working with temporaries
VectorN operator*(VectorN v, double d)
{
// reuse code
return v *= d;
}
VectorN operator*(double d, VectorN v)
{
// reuse code
return v *= d;
}
Сделайте то же самое с Vector3
.
Что было сделано, так это то, что вы получили простой способ написания этих операторов, поскольку вы можете использовать ядро оператора, а тип возвращаемого значения совпадает, благодаря ковариации.
Прислушайтесь к предупреждениям, хотя, вероятно, вам это не нужно. И расширения, которые вы хотите сделать, могут быть сделаны с помощью свободных функций, работающих на vector
или valarray
.