クラス階層の異なるレベルでoperator*()
(単項逆参照演算子)とoperator*(double f)
(ネイティブdouble
引数を持つメンバ二項乗算)の両方を上書きすることはできませんか?C++サブクラスオーバーロードされた乗算演算子がベースオーバーロードの参照外オペレータを隠す
は考えてみましょう:
// base.h:
template<typename T>
class base {
public:
base(T v) : m_v(v) { }
T& operator*() { return m_v; }
const T& operator*() const { return m_v; }
protected:
T m_v;
};
と
// special.h:
#include "base.h"
class super_double : public base<double> {
public:
super_double (double v) : base(v) { }
const super_double operator* (double f) { return super_double (m_v * f); }
};
メンバーのバイナリoperator*
が彼らの呼び出し規則が異なるため間接参照演算子は、基本クラスから継承された隠し、なぜ私は理解していません。次のコードは、super_double
がoperator*(double f)
を定義していない場合は罰金コンパイルが、それがない場合はエラーを発し:
super_double q(289.3);
double d = *q; // Only good if super_double doesn't define operator*(double f)
operator*
の両方の形式ではなく、テンプレートベースクラスで定義されている場合はそれもいいのよ。
なぜサブクラスの 'operator*(double f)
バイナリは基本クラスの単項を隠すのですかoperator*()
?