use*_*729 9 php virtual abstract
是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();
Run Code Online (Sandbox Code Playgroud)
输出是 2
Yac*_*oby 18
在PHP中,所有没有私有函数都是虚函数,因此不需要将它们显式声明为虚函数.
将成员函数声明为abstract简单意味着基类不能提供实现,但是所有派生类都应该.将方法定义为抽象与在C++中执行以下操作相同
virtual void foo() = 0;
Run Code Online (Sandbox Code Playgroud)
这仅仅意味着派生类必须实现foo();
编辑:关于编辑的问题
b::call()无法访问a::test().因此,在调用私有函数时,只会调用调用它的类中的函数.
编辑:关于评论:
(来自Wikipieda)
在面向对象的编程中,虚函数或虚方法是一种函数或方法,其行为可以通过具有相同签名的函数在继承类中重写.
由于明确说明您在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
}
Run Code Online (Sandbox Code Playgroud)
将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
}
Run Code Online (Sandbox Code Playgroud)
注意,如果f上面的示例中的变量是类型的,Bar*或者Bar如果Foo::baz()是虚拟的则无关紧要因为已知的预期类型(程序员明确提供它)
小智 5
该示例没有显示典型的专业化模式,其中 b 不需要知道实现细节,call()但可以指定如何test()完成。不幸的是它确实回来了1。然而,通过声明函数受保护而不是私有,它将按预期工作。
class a {
protected function test()
{
echo 1;
}
public function call() {
$this->test();
}
}
class b extends a {
protected function test()
{
echo 2;
}
}
$instance = new b();
$instance->call();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9932 次 |
| 最近记录: |