Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当从超类的指针调用时,基类函数不重写超类函数_C++_Function_Pointers_Inheritance - Fatal编程技术网

C++ 当从超类的指针调用时,基类函数不重写超类函数

C++ 当从超类的指针调用时,基类函数不重写超类函数,c++,function,pointers,inheritance,C++,Function,Pointers,Inheritance,我有一个类sub,它继承自一个类super。它们都定义了一个函数void function()(因此sub中的函数将覆盖super中的函数)。我创建一个super指针,并为其分配一个sub的新实例。然后,我通过super指针对sub的实例调用function()。但是,调用的是super中的函数,而不是sub中的函数。我希望它调用sub中的函数,而不是super中的函数。我该怎么做 #include <cstdio> class super { public:

我有一个类
sub
,它继承自一个类
super
。它们都定义了一个函数
void function()
(因此
sub
中的函数将覆盖
super
中的函数)。我创建一个
super
指针,并为其分配一个
sub
的新实例。然后,我通过
super
指针对
sub
的实例调用
function()
。但是,调用的是
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;  
}
#包括
类超级{
公众:
void函数(){
printf(“Super\n”);
}  
};  
类子:公共超级{
公众:
void函数(){
printf(“Sub\n”);
}  
};  
int main(){
超级*p;
p=新的子组件;
p->function();
返回0;
}

声明应为:

virtual void function()
<>我对C++是生疏的,但是基本上如果函数不是虚拟的,编译器会把你带到你的字上,如果指针指向超级函数,函数()函数调用Sup::For()。虚拟告诉它,您希望它找出正确的一个。实际上,这意味着它将创建一个vtable,并执行间接查找。那么不管它是超级*还是子*,因为它们都有一个vtable,并且vtable将针对对象的实际类型指向函数()的正确版本。

    class super {  
        public:
        virtual void function() {  
            printf("Super\n");  
        }  
    };
    
  • 要使用基类指针调用派生类函数,需要实现名为函数重写的概念
  • 但在您的例子中,您实现了函数隐藏,而不是函数重写
  • 若要重写函数,派生类和基类都应具有相同的函数签名,并且基类函数声明必须使用
    virtual
    关键字声明
  • 如果在基类声明中使用
    virtual
    关键字,那么内存中会有一个虚拟表,它负责调用类链中的大多数派生函数
要了解更多信息,请阅读以下内容:


默认情况下,函数不是虚拟函数。在调用函数之前,可以将指针强制转换为子类<代码>((sub*)p)->函数()