代码之家  ›  专栏  ›  技术社区  ›  Han

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

  •  2
  • Han  · 技术社区  · 16 年前

    我有一个基类叫做 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;
        }
    }
    

    但是,当我实例化 令人敬畏的包裹 打电话 isAwesome() ,该方法返回 false 而不是 true . 为什么会这样?

    2 回复  |  直到 16 年前
        1
  •  8
  •   R Samuel Klatchko    16 年前

    您的代码是否在数据包构造函数中调用isAwesome:

    Packet::Packet()
    {
        // this will always call Packet::isAwesome
        if (isAwesome())
        {
        } 
    }
    

        2
  •  4
  •   Nikolai Fetissov    16 年前

    这完全取决于您如何调用该方法。考虑一下:

    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塞缪尔·克拉奇科 .