📜  默认虚拟行为在C++和Java中有何不同

📅  最后修改于: 2020-03-29 09:41:00             🧑  作者: Mango

方法的默认虚拟行为在C++和Java中相反:
在C++中,默认情况下,类成员方法是非虚拟的。可以使用virtual关键字将它们虚拟化。例如,在以下程序中,Base :: show()是非虚拟的,并且程序打印“ Base :: show()named”

#include
using namespace std;
class Base {
public:
    // 默认非虚拟
    void show() {
         cout<<"Base::show()被调用";
    }
};
class Derived: public Base {
public:
    void show() {
         cout<<"Derived::show()被调用";
    }
};
int main()
{
  Derived d;
  Base &b = d;
  b.show();
  getchar();
  return 0;
}

Base :: show()的定义之前添加虚拟,使程序打印“ Derived :: show()被调用”
在Java中,默认情况下方法是虚拟的,可以使用final关键字将其设置为非虚拟的。例如,在下面的Java程序中,show()默认为虚拟,程序打印“ Derived :: show()named”

class Base {
    // 默认虚拟
    public void show() {
       System.out.println("Base::show()被调用");
    }
}
class Derived extends Base {
    public void show() {
       System.out.println("Derived::show()被调用");
    }
}
public class Main {
    public static void main(String[] args) {
        Base b = new Derived();;
        b.show();
    }
}

与C++非虚拟行为不同,如果我们在Base中的show()定义之前添加final,则上述程序将无法编译。