面向对象继承与覆盖
面向对象是C++和Java的重要特性,在C++中可通过virtual
关键字声明虚函数,通过指针调用函数时根据调用对象的类型不同执行不同的动作,而Java中除了通过static
关键字声明的静态方法(属于类而不是对象)和native
关键字声明的本地方法外,都具有多态的特性。
C++ 覆盖
#include <iostream>
using std::cout;
using std::endl;
class Base {
public:
virtual void func() {
cout << "Base call" << endl;
}
void test() {
this -> func();
}
};
class Deliver : public Base {
void func() {
cout << "Deliver call" << endl;
}
};
int main() {
Base *base = new Deliver();
base -> test();
}
输出
Deliver call
说明Base
类中的test
方法接收的是调用对象的this
指针,执行相应的方法。
如果我们需要指定执行基类的方法,我们可以使用域作用符,改写test
方法:
void test() {
this -> Base::func();
}
这样就可以调用Base
类中的func
方法。
Java 覆盖
我们可以很轻松地将上代码改写成Java代码:
package net.colors_wind.test;
import static java.lang.System.out;
abstract class Base {
public void func() {
out.println("Base call");
}
public final void test() {
Base.this.func();
}
}
class Deliver extends Base {
@Override
public void func() {
out.println("Deliver call");
}
}
public class Main {
public static void main(String[] args) {
Base base = new Deliver();
base.test();
}
}
在test
方法中,即便强调是Base
的this
指针(更准确的说法是引用),输出依然是:
Deliver call
事实上,对应Java说法来说,
public final void test() {
func();
this.func();
Base.this.func();
}
上三种调用func
方法的形式是等价的。