1

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

#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;  
}
4

3 回答 3

0

声明应为:

virtual void function()

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

于 2013-03-10T05:19:09.510 回答
0
class super {  
    public:
    virtual void function() {  
        printf("Super\n");  
    }  
};
于 2013-03-10T05:28:38.717 回答
0
  • 要使用基类指针调用派生类函数,您需要实现称为函数覆盖的概念。
  • 但是在您的情况下,您实现了功能隐藏,而不是功能覆盖。
  • 要覆盖函数,派生类和基类都应该具有相同的函数签名,并且必须使用virtual关键字声明基类函数声明。
  • 如果virtual在基类声明中使用关键字,那么内存中的虚拟表会负责调用类链的大多数派生函数。

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

于 2013-03-10T05:31:04.203 回答