オーバーロードしたメンバ関数が継承後,利用できない
オーバーロードしたメンバ関数のクラスを継承後,そのメンバ関数と同名のメンバ関数を定義すると,オーバーロードしたメンバ関数が呼び出せなくなります.何故でしょうか?
質問を一言で正確に表現できてないと思いますので,状況を順を追って説明します.
まず,クラスT1にメンバ関数m(int)があったとします. そのメンバ関数をオーバーロードしてm(float)を作ったとします. そして,T1を継承してT2を定義し,その中でメンバ関数m(int)をオーバーライドすると,T2のオブジェクトではm(float)が呼び出せなくなってしまいました.
何故この様なことをするかといいますと,m(string)はstringの引数をある関数で変換して整数にしてから,intでm(int)を呼び出しているとします.
T2でも,stringによってm(int)を呼び出すので,T1で定義したm(string)をT2でもそのまま使いたいのです.
例です
class T1{
public:
virtual void m(int i){cout<<i<<"T1\n";}
void m(string s){m((int)s[0]);}
};
class T2{
public:
virtual void m(int i){cout<<i<<"T2\n";}
};
int main(){
T2 t;
string s("a");
// t.m(s); /*error*/
t.T1::m(s);
}
出力
97T2
T1のm(string)はT2のm(int)を呼び出してます.
何か解決策ありますでしょうか?
また,言語の仕様がこの様になってるのは,この様なことをすると問題があるからだと思うのですが,どのような問題が起こるので禁止されてるのでしょう?
それとも実は,この様なことはできるのでしょうか?
(つまり,単に私のプログラムが間違ってる)
お礼
>単精度浮動小数点とか倍精度浮動小数点型にすると桁落ちしたりという事を言っているのではないでしょうか。 そこまで、わかっていないと思うのですが・・・ 私のロジックでは、Ccurで変換していたのですが、ストリング変換しろって、言われましたから・・・ fix関数が具体的に何をやっているのか、わからないものなんでしょうか?