2017-01-04 18 views
1

仮想メソッドをオーバーライドすると、子の引数の名前を変更できますか?引数の同じ型、ちょうど変更(int num)(int n)に言う?C++継承時に関数の引数の名前を変更しますか?

この例は有効ですか?

class Animal 
{ 
    public: 
    virtual int foo(int num) { 
     return num + 1; 
    } 
}; 

class Cat : public Animal 
{ 
    public: 
    int foo(int n) override { 
     return n - 1; 
    } 
}; 

もしそうなら、なぜ引数の名前は関係ありませんか?

答えて

3

適切な答えを出すために、引数の名前は関数シグネチャの一部ではないので問題はありません。 (かなり包括的な)説明については、http://en.cppreference.com/w/cpp/language/functionを参照してください。

ちなみに、const - 引数そのものも署名の一部ではありません。この方法では、void foo(const int x);foo (int x)は同等です。

+0

おかげと同じsignatureを持っていることを確認してくださいタイプ!あなたのコメントとサムの「const」は矛盾しているようですね。 – hubatish

+1

@hubatishサムは、関数が 'const'としてマークされていると話しています。関数のパラメータではありません。 – NathanOliver

+1

また、constnessはこれより少し微妙であることに注意してください。 'void foo(const int * x);と' void foo(int * x) 'は2つの異なる関数です(なぜなら、ここではconstのxではないからです)。 – Frank

1

私は追加してコードをコンパイル:

int main() { 
    // your code goes here 
    Animal a; 
    Cat c; 
    cout << a.foo(4) << endl; 
    cout << c.foo(4) <<endl; 
    return 0; 
} 

このRANと5の予想される出力、

3.だから、引数名を変更することは完全に有効なようですを与えました。

4

引数の名前は無関係です。

一致する必要があるのは、パラメータのタイプだけです。

また、クラスメソッド自体がconstかどうか。メソッドの戻り値は一致しなければなりません。

0

仮想メソッドを使用している間は、メソッドの宣言を同じに保つだけです。つまり、あなたのコードについて言えば、変数番号は変更できますが、データ型、パラメータリスト、戻り値の型および関数名は変更できません。

1

宣言されている関数の範囲がパラメータである限り可能です。重要なのはパラメータの数であるので、オーバーライドされた関数は、応答とリンクするためのベースの

class Animal 
{ 
    public: 
    virtual int foo(int) { // even no parameter identifier and it is ok 
     return 0; 
    } 
}; 

class Cat : public Animal 
{ 
    public: 
     int foo(int n) { 
     return n - 1; 
    } 
}; 
+1

名前のないパラメータはクレイジーです!啓示に感謝します。 – hubatish

関連する問題