PHP では、すべての非公開関数は仮想ではないため、明示的に仮想として宣言する必要はありません。
メンバー関数を単に宣言abstract
することは、基本クラスが実装を提供できないことを意味しますが、すべての派生クラスは実装を提供する必要があります。メソッドを抽象として定義することは、C++ で次のことを行うことと同じです。
virtual void foo() = 0;
これは単に、派生クラスが実装する必要があることを意味しますfoo();
編集:編集された質問について
b::call()
アクセスできませんa::test()
。このため、プライベート関数を呼び出すと、それが呼び出されたクラス内の関数のみが呼び出されます。
編集:コメントについて:
(ウィキペダより)
オブジェクト指向プログラミングでは、仮想関数または仮想メソッドは、同じシグネチャを持つ関数によって継承クラス内で動作をオーバーライドできる関数またはメソッドです。
C++ では対価を明示的に示すという考え方により、派生クラスが関数をオーバーライドできるように、関数を仮想として宣言する必要があります。
class Foo{
public:
void baz(){
std::cout << "Foo";
}
};
class Bar : public Foo{
public:
void baz(){
std::cout << "Bar";
}
};
int main(){
Foo* f = new Bar();
f->baz(); //baz is not virtual in Foo, so the output is Foo
}
baz を仮想に変更する
class Foo{
public:
virtual void baz(){
std::cout << "Foo";
}
};
//Same Bar declaration
int main(){
Foo* f = new Bar();
f->baz(); //baz is virtual in Foo, so the output is Bar as it will call the derived function
}
f
上記のサンプルの変数がタイプであった場合、Bar*
または目的のタイプが既知であるため、仮想であるかBar
どうかは問題ではないことに注意してください(プログラマーが明示的に指定しました)Foo::baz()