東西讓我發瘋。爲什麼這會給我一個Java中的ClassCastException,而它在C++中運行良好?
假設我們有這些簡單的類
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++代碼:
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
}
它爲什麼會生成Java運行時錯誤,而這將在沒有C++的一個問題工作?
謝謝
它確實 「沒有問題的工作。」由於C傳統,這是未定義的行爲。 –
狗是動物,但動物不一定是狗 –
可能重複[顯式從超類轉換爲子類](https://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to -subclass) –