ページ 11

オーバーライドが邪魔です

Posted: 2012年10月17日(水) 21:33
by dom
現在以下のようなクラスを考えています。

template <int> class Test;
Test<0>は引数なしの関数func()をもつ。
Test<N>は引数にintをN個までとる関数func(int,...)をもつ。つまり、 func(), func(int), func(int,int), ... , func(int × N)のN+1個の関数を持つ。

その為に次のような実装を考えたのですが、オーバーライドにより基底クラスのfuncが無効になっていしまいます。
Nは10程度なのですが、地道に実装するしかないのでしょうか?

コード:

template <int>
class Test;

template<> class Test<0> {
    void func();
};
template<> class Test<1> : public Test<0> {
    void func(int);
};
template<> class Test<2> : public Test<1> {
    void func(int, int);
};

// 以下同様......

Re: オーバーライドが邪魔です

Posted: 2012年10月17日(水) 22:08
by a5ua
こんな感じでどうですかね?

コード:

template <int>
class Test;
 
template<> class Test<0> {
public:
	void func(){}
};
template<> class Test<1> : public Test<0> {
public:
	using Test<0>::func;
	void func(int){}
};
template<> class Test<2> : public Test<1> {
public:
	using Test<1>::func;
	void func(int, int){}
};

Re: オーバーライドが邪魔です

Posted: 2012年10月17日(水) 22:11
by h2so5
これはオーバーライドではありません。
サブクラスの func(int) が基底クラスの func() よりもクラススコープの内側にあるため、
func(int) が先に検索されてしまうのが原因です。

オーバーライドは基底クラスの関数が virtual で、サブクラスで同じ名前・引数の関数が定義されていないと成立しません。

同じ問題が紹介されていますので、参考にどうぞ
http://d.hatena.ne.jp/minekoa/20080222/1203696120

Re: オーバーライドが邪魔です

Posted: 2012年10月17日(水) 22:27
by dom
a5uaさん、h2so5さん、返信ありがとうございました。とても参考になりました。
c++は奥が深いですね。