ページ 11

引数の違う親クラスの関数が使えなくなる

Posted: 2016年9月29日(木) 14:15
by こんた
あるメンバ関数を持った親クラスを継承した子クラスが、引数の違う同じ名前のメンバ関数を作った時に親クラスのメンバ関数が使えなくなってしまいます。
以下のようなコードを書くとエラーになってしまいます。(クラス名、関数名、処理は適当です)
環境はvisual studio 2015です。

コード:

class Base {
public:
	int func(int a) { return a + 1; }
};

class Myclass : public Base {
public:
	int func(int a, int b) { return a + b; }
};

int main() {
	Myclass a;
	a.func(1); //エラー

	return 0;
}
原因と解決法が教えていただきたいです。
宜しくお願いします。

Re: 引数の違う親クラスの関数が使えなくなる

Posted: 2016年9月29日(木) 15:08
by たいちう
ここに原因と解決法があります。

CodeZine『C++による開発で陥りやすい問題点の検証』
オーバーロードとオーバーライド
https://codezine.jp/article/detail/276?p=5

Re: 引数の違う親クラスの関数が使えなくなる

Posted: 2016年9月29日(木) 15:40
by こんた
解答ありがとうございます。

これを読むかぎり、派生クラスでもう一度func(int a)を実装しろってことでしょうか?
それって継承が意味をなしてないというか何の解決にもなってないような気がするのですが他の解決法はないのでしょうか?
具体的にはMyClassクラスでfunc(int a, int b)を実装してもBaseクラスのfunc(int a)を使えるようにする方法が知りたいです。

Re: 引数の違う親クラスの関数が使えなくなる

Posted: 2016年9月29日(木) 16:01
by たいちう
確かに実装しなおしとも言えますが、私なら多分このようにします。
実際のfunc(a)の中身はそこそこ複雑な処理でしょうが、
それを2回書く必要はありません。

int func(int a) { return Base::func(a); }

Re: 引数の違う親クラスの関数が使えなくなる

Posted: 2016年9月29日(木) 17:38
by YuO
MyClassに

コード:

using Base::func;
と追加すると,Base::funcをMyClassのname lookup対象に追加できます。

Re: 引数の違う親クラスの関数が使えなくなる

Posted: 2016年9月29日(木) 22:44
by inemaru
(using宣言以外の方法では、)型を明示すれば呼び出せます。

コード:

class Base {
public:
	int func(int a) {
		return a + 1;
	}
};

class Myclass : public Base {
public:
	int func(int a, int b) {
		return a + b;
	}
};

int main()
{
	Myclass a;
	//a.func(1); //エラー
	a.Base::func(1);
	return 0;
}

Re: 引数の違う親クラスの関数が使えなくなる

Posted: 2016年10月01日(土) 02:18
by こんた
皆様ご解答ありがとうございます。
using宣言での解決策は知りませんでした。
参考にさせていただきます。