我有一个名为Packet的基类
// Header File
class Packet {
public:
virtual bool isAwesome() const {
return false;
}
}和一个名为AwesomePacket的继承类
// Header File
class AwesomePacket : public Packet {
public:
virtual bool isAwesome() const {
return true;
}
}但是,当我实例化AwesomePacket并调用isAwesome()时,该方法返回false而不是true。为什么会这样呢?
发布于 2010-01-22 05:24:27
您的代码很可能调用了包构造函数中的isAwesome:
Packet::Packet()
{
// this will always call Packet::isAwesome
if (isAwesome())
{
}
}即使这个Packet构造器被用来构造AwesomePacket对象的父对象,它也不会调用AwesomePacket::isAwesome。这是因为此时该对象还不是AwesomePacket。
发布于 2010-01-22 04:58:05
这完全取决于您如何调用该方法。请考虑以下内容:
AwesomePacket ap;
bool awesomeness0( ap.isAwesome()); // true, call is direct, not through vtable
AwesomePacket& rap( ap );
bool awesomeness1( rap.isAwesome()); // true, call is direct, not through vtable
Packet p( ap ); // WRONG (but legal): slicing child instance into space of parent
bool awesomeness2( p.isAwesome()); // false, call is direct, not through vtable
const Packet& rp( ap ); // the right way
bool awesomeness3( rp.isAwesome()); // true, call is through vtable
const Packet* pp( &ap ); // also the right way
bool awesomeness4( pp->isAwesome()); // true, call is through vtable这就是说,C++中的多态性只能通过引用或指向基的指针来工作。
编辑:
不要忘记在基类中添加一个虚拟析构函数。
编辑:
这也取决于你在哪里调用你的虚方法,见R Samuel Klatchko的答案。
https://stackoverflow.com/questions/2112759
复制相似问题