ネタ元 → Optionalをつける時
近頃のVBは引数の省略ができるのね。
Public Class Ramen
Protected chaashuu_ As Integer
Protected name_ As String
Public Sub New()
name_ = "ふつーのラーメン"
End Sub
Public Overridable Sub put_chaashuu(Optional ByVal n As Integer = 1)
chaashuu_ = n
End Sub
Public Sub info()
System.Console.WriteLine("{0} 焼豚{1}枚", name_, chaashuu_)
End Sub
End Class
上記のコードではメソッド put_chaashuu には引数として乗っけるチャーシューの枚数を与えます。
引数を Optional にしてあって、省略すると1枚チャーシューを乗っけてます。
んで、Ramenから導出したクラスChaashuumenでこのメソッドput_chaashuuをOverridesし、
Optional引数の規定値を4にできるかしら。
チャーシューメンなんだもの、何も言わなきゃ4枚くらい乗っけて欲しいやん♪
…ダメでした。Optionalの規定値もシグニチャの一部であるため、
シグニチャが一致しないOverrideを許してくれません。
C++だとちょと違う。
#include <iostream>
#include <string>
class Ramen {
protected:
int chaashuu_;
std::string name_;
public:
Ramen() : name_("ふつーのラーメン") {}
virtual void put_chaashuu(int n =1) { chaashuu_ = n; }
void info() const {
std::cout << name_ << " 焼豚" << chaashuu_ << "枚\n";
}
};
class Chaashuumen : public Ramen {
public:
Chaashuumen() { name_ = "チャーシューメン"; }
virtual void put_chaashuu(int n =4) { chaashuu_ = n; } // default値を変更
};
int main() {
Ramen* r = new Chaashuumen();
r->put_chaashuu(); // rはRamenなんだからチャーシューは1枚!
r->info();
dynamic_cast<Chaashuumen*>(r)->put_chaashuu(); // chaashuumanにキャストすれば4枚!!!
r->info();
delete r;
}
C++ではdefault引数の値はシグニチャに含まれません。
引数が省略されたとき、コンパイラはヘッダに指定された規定値を
呼び出し側で補完するっす。