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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こんた

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

#1

投稿記事 by こんた » 3年前

あるメンバ関数を持った親クラスを継承した子クラスが、引数の違う同じ名前のメンバ関数を作った時に親クラスのメンバ関数が使えなくなってしまいます。
以下のようなコードを書くとエラーになってしまいます。(クラス名、関数名、処理は適当です)
環境は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;
}
原因と解決法が教えていただきたいです。
宜しくお願いします。

たいちう
記事: 418
登録日時: 9年前

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

#2

投稿記事 by たいちう » 3年前

ここに原因と解決法があります。

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

こんた

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

#3

投稿記事 by こんた » 3年前

解答ありがとうございます。

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

たいちう
記事: 418
登録日時: 9年前

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

#4

投稿記事 by たいちう » 3年前

確かに実装しなおしとも言えますが、私なら多分このようにします。
実際のfunc(a)の中身はそこそこ複雑な処理でしょうが、
それを2回書く必要はありません。

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

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#5

投稿記事 by YuO » 3年前

MyClassに

コード:

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

inemaru
記事: 108
登録日時: 3年前

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

#6

投稿記事 by inemaru » 3年前

(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: 引数の違う親クラスの関数が使えなくなる

#7

投稿記事 by こんた » 3年前

皆様ご解答ありがとうございます。
using宣言での解決策は知りませんでした。
参考にさせていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る