面向对象继承与覆盖

面向对象是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方法中,即便强调是Basethis指针(更准确的说法是引用),输出依然是:

Deliver call

事实上,对应Java说法来说,

    public final void test() {
        func();
        this.func();
        Base.this.func();
    }

上三种调用func方法的形式是等价的。

最后修改:2020 年 07 月 08 日
如果觉得我的文章对你有用,请随意赞赏