【发布时间】:2014-01-22 11:16:30
【问题描述】:
我正在自学 C++,但遇到了我没想到的行为。我不确定,但确实认为这不是 Java 在类似情况下会做的事情。为什么Dog 和Cat 依赖父类实现并发出通用声音?
#include <iostream>
class Animal{
public:
virtual void speak(){std::cout << "???" << std::endl; /* not implemented */}
};
class Dog : public Animal{
public:
virtual void speak(){
std::cout << "Woof" << std::endl;
}
};
class Cat : public Animal{
public:
virtual void speak(){
std::cout << "Meow" << std::endl;
}
};
class Desk{
/* Not an animal */
};
template<class T>
void please_talk(){
T anim;
Animal ani = anim;
anim.speak();
ani.speak();
}
int main()
{
please_talk<Dog>();
please_talk<Cat>();
/* Does not compile please_talk<Desk>(); */
return 0;
}
结果:
Woof
Generic animal sound
Meow
Generic animal sound
【问题讨论】:
-
因为“ani”是Animal类型(它不是指向基类的指针,而是基类本身)。
-
你说得对,Java 不会这样做,主要是因为
Animal ani = anim;在 Java 和 C++ 中表示两个 非常 不同的东西(引用语义与值语义)。
标签: c++ class inheritance methods virtual