Is it abstract function xxx
?
我刚刚做了一个测试,似乎表明私有方法也是虚拟的?
class a {
private function test()
{
echo 1;
}
}
class b extends a {
private function test()
{
echo 2;
}
public function call()
{
$this->test();
}
}
$instance = new b;
$instance->call();
输出是2
在 PHP 中,所有非私有函数都是虚拟的,因此无需显式将它们声明为虚拟。
将成员函数声明为abstract
只是意味着基类无法提供实现,但所有派生类都应该提供。将方法定义为抽象方法与在 C++ 中执行以下操作相同
virtual void foo() = 0;
这仅仅意味着派生类must实施foo();
EDIT:关于编辑的问题
b::call()
无法访问a::test()
。因此,当调用私有函数时,只会调用调用该函数的类中的函数。
EDIT:
关于评论:
(来自维基百科)
在面向对象编程中,虚函数或虚方法是一种函数或方法,其行为可以在继承类中被具有相同签名的函数覆盖。
由于 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*
or Bar
没关系,如果Foo::baz()
是否是虚拟的,因为预期的类型是已知的(程序员明确提供了它)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)