2017-06-05 3 views
-1

何かが私を夢中にしています。これはJavaでClassCastExceptionをなぜ私に与えますが、C++ではうまく動作しますか?

class Animal { 
    public: 
      virtual void makeSound(){ cout<<" From Animal";} 
}; 

class Dog : public Animal { 
    public : void makeSound(){ cout<<" From Dog ";} 
      void flip() { cout<<"Flipped";} 
}; 

main() { 
Animal *a = new Animal(); 
((Dog*)a)->makeSound(); // returns From animal 

    } 

それはC++で問題なく動作するでしょうが、なぜそれが、Javaで実行時エラーが生成されます。

は、我々はこれらの単純なクラス

public class Animal { 
public void makeSound() { 
    System.out.println("From Animal"); 
    } 
} 

public class Dog extends Animal { 
public void makeSound() { 
    System.out.println("From Dog"); 
} 

public void flip() { 
    System.out.println("Flipped"); 
} 

public static void main(String[] args) { 
    Animal a= new Animal(); 
    ((Dog)a).makeSound(); // Gives me an error at runtime.  

} 

C++のコードを持っていると仮定しますか?あなたのコードの中でいくつかの点であなたは、例えば、子クラスを参照する場合

は(Javaで)

+0

それは "問題なく機能する" ありません。 Cレガシーによる未定義の動作です。 –

+2

犬は動物ですが、動物は必ずしも犬ではありません –

+0

[スーパークラスからサブクラスへの明示的なキャスト]が重複している可能性があります(https://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to -subclass)を同じサンプルで –

答えて

4

あなたの例は正常に動作しません。その動作は未定義です。

C++にはいくつかの異なるタイプのキャスト操作があります。ここで使用しているものはC-style castです(技術的にはstatic_castとなります)。 Cスタイルのキャストは実行時の型チェックを行いません。関係するタイプが意味をなさないことを確認することはプログラマの責任です。実行時の型チェックが必要な場合は、dynamic_castを使用してください。 dynamic_castにポインタを使用すると、キャストは失敗し、オブジェクトが実際にキャストされる型のインスタンスでない場合はnullptrを返します。参照を使用すると、std::bad_castがスローされます。

class Animal { 
public: 
    virtual void makeSound() { std::cout << "From Animal\n"; } 
}; 

class Dog : public Animal { 
public: 
    void makeSound() { std::cout << "From Dog\n"; } 
}; 

int main() { 
    Animal *a = new Animal(); 
    Dog* d = dynamic_cast<Dog*>(a); 
    if (d == nullptr) { 
     std::cout << "cast failed\n"; 
    } else { 
     d->makeSound(); 
    } 
} 

Live example

0

ダウンキャストのみ可能ですありがとう

Animal a = new Dog(); 
((Dog)a).makeSound(); 
+0

downvoteの任意の説明をいただければ幸いです。ありがとう。 – anonymouse

+0

通常、これはaが犬であるがAnimalのメソッドしか持たないために機能します。 ここでダウンキャストしている間、私たちはDogのメソッドにもアクセスできます。 したがって、ダウンキャスト直前と直後の両方でmakeSound()を呼び出すと、常にDogから返されます。 P.S:評判があまりないので投票しません。しかし、私はあなたの答えをありがとう! – ZikoUdeM

関連する問題