从超类的指针调用时,基类函数不会覆盖超类函数

时间:2013-03-10 05:10:01

标签: c++ function pointers inheritance

我有一个类sub,它继承自类super。它们都定义了一个函数void function()(因此sub中的函数会覆盖super中的函数。我创建了一个super指针并为其指定了sub的新实例。然后,我通过function()指针在sub的实例上调用super。但是,调用super中的函数,而不是sub中的函数。我希望它在sub中调用该函数,而不是super中的函数。我该怎么做?

#include <cstdio>  

class super {  
    public:
    void function() {  
        printf("Super\n");  
    }  
};  

class sub: public super {  
    public:  
    void function() {  
        printf("Sub\n");  
    }  
};  

int main() {  
    super *p;  
    p = new sub;  
    p->function();  
    return 0;  
}

3 个答案:

答案 0 :(得分:0)

声明应该是:

virtual void function()

我在C ++上生锈了,但基本上如果函数不是虚拟的,编译器会告诉你如果指针指向super,那么function()调用将转到super :: function() 。虚拟告诉它你希望它找出正确的一个。实际上,这意味着它将创建一个vtable,并进行间接查找。然后它是一个super *还是sub *并不重要,因为它们都有一个vtable,而vtable将指向对象的实际类型的函数()的正确版本。

答案 1 :(得分:0)

class super {  
    public:
    virtual void function() {  
        printf("Super\n");  
    }  
};

答案 2 :(得分:0)

  • 要使用基类指针调用派生类函数,需要实现名为function overriding的概念。
  • 但在你的情况下,你实现了功能隐藏,而不是功能覆盖。
  • 要覆盖函数,派生类和基类应具有相同的函数签名,并且必须使用 virtual 关键字声明基类函数声明。
  • 如果在基类声明中使用 virtual 关键字,则在内存中使用虚拟表,它会处理对类链的大多数派生函数的调用。

如需更多理解,请阅读以下内容:

相关问题