#ruby の場合
まずは ruby。
ruby2.4
class Foo
private
def hoge
p :hoge_in_Foo
end
end
class Bar < Foo
def hoge # エラーにならず、オーバーライド出来てしまう
p :hoge_in_Bar
end
end
b = Bar.new
b.hoge # Bar#hoge が呼ばれる
だまって override 出来てしまう。
警告は出ない。
トラブルの原因になると思う。
#Java の場合
Java の場合は:
Foo.java
class Foo
{
private void hoge(){ System.out.println( "hoge in Foo" ); }
}
Bar.java
class Bar extends Foo
{
@Override
public void hoge(){ //=>エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
System.out.println( "hoge in Bar" );
}
public static void main( String[] args ){
(new Bar()).hoge();
}
}
などとやると、上記のコメントの通りエラーになる。好ましい。
そもそも Foo の hoge はオーバーライド可能なメソッドではないんだから、当たり前。
なので、「@Override
」がないと、エラーも警告も出ない。
#C++ の場合
c++11
#include <iostream>
class Foo
{
private:
virtual void hoge(){ std::cout << "hoge in Foo\n"; }
};
class Bar: public Foo
{
public:
virtual void hoge() override { std::cout << "hoge in Bar\n"; }
};
int main()
{
Bar bar;
bar.hoge(); // okay
}
普通にオーバーライドできる。
オーバーライドできるのは、Foo の hoge が virtual なんだから当然。
ただ、可視性を private から public に変更していても警告が出ないのはどうかなと思わなくもない。
そもそも private で virtual という時点で警告を出してくれてもいいかもと思わなくもない。
※ C# だとどうなるんだっけ?