私は以下のコードを試していました:
クラスのオブジェクトを指しているポインタopengascap()で車のクラスを呼び出していますが、ポイントされているオブジェクトの機能を提供しています。私の質問は、関数名がクラスに存在しないのに、なぜ出力が「fire」になるのかということです。car*nuclear**nuclear***nuclearsubmarine
  #include <iostream>
  using namespace std;
  class Vehicle 
  {
      public:
      virtual ~Vehicle() { }
      virtual void startEngine() = 0;
  };
  class Car : public Vehicle 
  {
  public:
      virtual void startEngine()
      {
          cout<<"start car";
      }
      virtual void openGasCap()
      {
      cout<<"open";
      }
  };
  class NuclearSubmarine : public Vehicle 
  {
      public:
      virtual void startEngine()
      {
          cout<<"start ship";
      }
      virtual void fireNuclearMissle()
      {
          cout<<"fire";
      }
  };
 int main()
 {
     Car   car;
     Car*  carPtr = &car;
     NuclearSubmarine  sub;
     NuclearSubmarine* subPtr = ⊂
     carPtr=(Car*)subPtr;
     // This last line would have caused carPtr to point to sub !
     carPtr->openGasCap();  // This might call fireNuclearMissle()!
     return 0;
 }
Ouput:火