C++和Java中的虚拟机制

Jav*_*eak 5 c++ java oop vptr

我对C++和Java中的虚拟机制有一些困惑.以下程序的输出是不同的.我无法理解为什么?

在Java中:

class Base 
{ 
    Base()
    {
        show();
    }    
    public void show() 
    {
       System.out.println("Base::show() called");
    }
}

class Derived extends Base 
{
    Derived()
    {        
        show();        
    }
    public void show() 
    {
       System.out.println("Derived::show() called");
    }
}

public class Main 
{
    public static void main(String[] args) 
    {
        Base b = new Derived();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Derived::show() called
Derived::show() called
Run Code Online (Sandbox Code Playgroud)

在C++中,输出如下:

#include<bits/stdc++.h>
using namespace std;

class Base
{
    public:
    Base()
    {
        show();
    }
    virtual void show()
    {
       cout<<"Base::show() called"<<endl;
    }
};

class Derived : public Base
{
    public:
    Derived()
    {
        show();
    }
    void show()
    {
       cout<<"Derived::show() called"<<endl;
    }
};

int main()
{
    Base *b = new Derived;
}
Run Code Online (Sandbox Code Playgroud)

是:

Base::show() called
Derived::show() called
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?