1

そのため、作成しようとしているクラス階層で奇妙な動作が発生しています。グラフを実装しており、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つの完全に異なるシンボルとして認識していると思ったので、これは私には意味がありません。したがって、シンボルが異なる引数を取るために継承が不可能であっても、継承でオーバーライドされるべきではありません。

4

2 に答える 2

4

派生クラスの定義は、基本クラスのオーバーロード宣言を非表示にします。

それらを派生クラスのスコープに入れるには、次usingのような宣言を使用します。

using Graph::addVertex;

派生クラスで。

ちなみに、これはよくある質問です。質問する前にFAQを確認することをお勧めします。または一般的にさえ。:-)

于 2012-11-20T04:18:57.757 に答える
1

この場合AdjacencyMatrixGraphは非表示になりGraph::addVertex(unsigned int from, unsigned int to, double weight, bool bidirectional)ます。関数をスコープに入れるには、using以下に示すように宣言を使用します。

class A
{
public:
virtual void foo(int) = 0;
virtual void foo(std::string) { std::cout << "foo(string)" << std::endl; }
};

class B : public A
{
public:
using A::foo; //this unhides A::foo(std::string)
virtual void foo(int) { std::cout << "foo(int)" << std::endl; }
};

int main()
{
B b;
b.foo(1);
b.foo("hello");
}
于 2012-11-20T05:23:58.123 に答える