2011-06-17 23 views
3

Possible Duplicate:
Overriding a Base's Overloaded Function in C++C++仮想関数の問題が

は、私のようなクラスを持って、この1:その後、

class Sub : public Object { 
public: 
    virtual void alignment(int i); 
}; 

:私はこのようなサブクラス化しよう

class Object { 
public: 
    int alignment() const; 
    virtual void alignment(int i); 
}; 

Sub *sub = new Sub(); 
sub->alignment(10); 
int a = sub->alignment(); 

T彼はコンパイラ(clang 1.0)はエラーを生成します: "関数呼び出しに引数が少なすぎる、期待される1、0があります。"私は引数を取る仮想関数が非仮想constと混同している理由を理解していません。誰かが理由を説明できますか?

+0

これを参照してください:http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c/888313#888313 –

+0

@Fred Larsonそれは私が探していた説明だった! – joshfisher

答えて

3

はい。このようにすると、は、基底クラスの関数オーバーロードを隠蔽します。以下は意図明確になり、私の意見では

using Object::alignment; 
+0

これを行うと、vtableへの未定義の参照についてエラーが発生します。 [ここ](http://ideone.com/XoqPN)を参照してください。 –

+0

オーバーロードされたメンバー関数が仮想であることは許可されていますか? – Mahesh

+1

@Space:関数を定義する必要があります –

-2

int a = sub> alignment();

パラメータを指定していない場合は、パラメータを指定しませんでした。

+1

男の子、たくさんの人がこの1つで質問を読まずに答える –

+1

まあ、たわごと。あなたは私をそこに連れてきた。 – MGZero

1


int a = sub->Object::alignment();

をSpace_C0wb0yことにより、前述のようにまた、あなたは、公共のキーワードを指定していないこの問題を解決するために、あなたのSubクラスに以下を追加します。

+1

これは確かに別の解決策です。しかし、私はこれがより明確であることに同意することはできません! –

3

名前ルックアップは、あなたが思うように動作しません。

コンパイラはSubから開始し、alignmentという名前の関数があるかどうかを調べます。それは...それは見て停止します。それは既にマッチを見つけたので、親クラスを見ても気にしません。つまり、Subの仮想オーバーライドは、Objectの非仮想関数を非表示にします。残念ながら、その一致には整数パラメータが必要ですが、あなたはそれを提供しませんでした。

alignmentの機能が両方とも仮想であっても、何も変わらないことに注意してください。 1つのメソッドをオーバーライドすると、他のすべてのバージョンが非表示になります。

修正するには、Subのusing宣言を指定して、他の関数をスコープに入れて、name lookupで両方のバージョンが見つかるようにします。