Zuallererst Rubin.
ruby2.4
class Foo
private
def hoge
p :hoge_in_Foo
end
end
class Bar < Foo
def hoge #Es kann fehlerfrei überschrieben werden
p :hoge_in_Bar
end
end
b = Bar.new
b.hoge # Bar#hoge heißt
Sie können es einfach überschreiben. Es gibt keine Warnung. Ich denke, es wird Ärger verursachen.
Für Java:
Foo.java
class Foo
{
private void hoge(){ System.out.println( "hoge in Foo" ); }
}
Bar.java
class Bar extends Foo
{
@Override
public void hoge(){ //=>Error:Die Methode überschreibt oder implementiert die Supertyp-Methode nicht
System.out.println( "hoge in Bar" );
}
public static void main( String[] args ){
(new Bar()).hoge();
}
}
Wenn Sie so etwas tun, wird eine Fehlermeldung angezeigt, wie im obigen Kommentar beschrieben. bevorzugt.
Foo's Hoge ist in erster Linie keine überschreibbare Methode, daher ist es natürlich.
Ohne " @ Override
"gibt es also keinen Fehler oder eine Warnung.
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
}
Kann normal überschrieben werden. Natürlich kann es überschrieben werden, da Foo's Hoge virtuell ist. Es ist jedoch nicht überraschend, dass die Warnung nicht angezeigt wird, selbst wenn die Sichtbarkeit von privat zu öffentlich geändert wird. Erstens ist es in Ordnung, eine Warnung zu geben, wenn es privat und virtuell ist.