そのため、作成しようとしているクラス階層で奇妙な動作が発生しています。グラフを実装しており、AdjacencyMatrixGraphとAdjacencyListGraphによって実装されるGraphクラスを作成して、任意のグラフとして使用できるようにしています。それらを使用したかった。
グラフに1つの純粋仮想関数があり、AdjacencyMatrixGraphの関数で上書きされますが、同じ名前の非仮想関数がありますが、グラフの署名が異なります。AdjacencyMatrixクラスにアクセスするときにGraphクラスの非仮想メソッドを呼び出すことはできませんが、非仮想メソッドの名前を変更すると正常に機能します。
このような:
クラスがこのように見えるとき
class Graph
{
public:
virtual void addVertex(Vertex vert, bool bidirectional)=0;
void addVertex(unsigned int from, unsigned int to, double weight, bool bidirectional)
}
class AdjacencyMatrixGraph : public Graph
{
...
}
AdjacencyMatrixGraph test;
Vertex vert;
test.addVertex(vert,false); //this statement compiles and works fine
test.addVertex(0,0,10.f,false) //this statement fails to compile and says cadidates are addVertex(Vertex, bool)
ただし、非仮想メソッドの名前をそのように変更すると、
class Graph
{
public:
virtual void addVertex(Vertex vert, bool bidirectional)=0;
void addVert(unsigned int from, unsigned int to, double weight, bool bidirectional)
}
AdjacencyMatrixGraph test;
Vertex vert;
test.addVertex(vert,false); //this statement compiles and works fine
test.addVert(0,0,10.f,false) //this statement compiles and works fine
コンパイラはaddVertex(Vertex、bool)とaddVertex(unsigned int、unsigned int、double、bool)を2つの完全に異なるシンボルとして認識していると思ったので、これは私には意味がありません。したがって、シンボルが異なる引数を取るために継承が不可能であっても、継承でオーバーライドされるべきではありません。