【发布时间】:2017-06-05 04:01:47
【问题描述】:
有些事情让我发疯了。
假设我们有这些简单的类
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 遗留问题,这是未定义的行为。
-
狗是动物,但动物不一定是狗
-
也许有些人会使用相同的示例,因为它在 Java 或 C++ 教程网站上随处可见,但只是在 Java 和 C++ 中使用相同的示例,我发现在 Java 中出现错误,而C++ 中没有错误,它执行没有问题
-
@ZikoUdeM 这不是 C++ 的错。 C 风格的转换只是不做任何运行时类型检查。如果需要,请使用
dynamic_cast。
标签: java c++ inheritance casting runtime-error