首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++继承的虚方法仍然使用基类实现

C++继承的虚方法仍然使用基类实现
EN

Stack Overflow用户
提问于 2010-01-22 04:46:30
回答 2查看 601关注 0票数 2

我有一个名为Packet的基类

代码语言:javascript
复制
// Header File
class Packet {
public:
    virtual bool isAwesome() const {
        return false;
    }
}

和一个名为AwesomePacket的继承类

代码语言:javascript
复制
// Header File
class AwesomePacket : public Packet {
public:
    virtual bool isAwesome() const {
        return true;
    }
}

但是,当我实例化AwesomePacket并调用isAwesome()时,该方法返回false而不是true。为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-22 05:24:27

您的代码很可能调用了包构造函数中的isAwesome:

代码语言:javascript
复制
Packet::Packet()
{
    // this will always call Packet::isAwesome
    if (isAwesome())
    {
    } 
}

即使这个Packet构造器被用来构造AwesomePacket对象的父对象,它也不会调用AwesomePacket::isAwesome。这是因为此时该对象还不是AwesomePacket。

票数 8
EN

Stack Overflow用户

发布于 2010-01-22 04:58:05

这完全取决于您如何调用该方法。请考虑以下内容:

代码语言:javascript
复制
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的答案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2112759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档