Loading... # 面向对象继承与覆盖 面向对象是C++和Java的重要特性,在C++中可通过`virtual`关键字声明虚函数,通过指针调用函数时根据调用对象的类型不同执行不同的动作,而Java中除了通过`static`关键字声明的静态方法(属于类而不是对象)和`native`关键字声明的本地方法外,都具有多态的特性。 ## C++ 覆盖 ```cpp #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`方法: ```cpp void test() { this -> Base::func(); } ``` 这样就可以调用`Base`类中的`func`方法。 ## Java 覆盖 我们可以很轻松地将上代码改写成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说法来说, ```Java public final void test() { func(); this.func(); Base.this.func(); } ``` 上三种调用`func`方法的形式是等价的。 最后修改:2020 年 07 月 08 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏