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
关键字,那么内存中会有一个虚拟表,它负责调用类链中的大多数派生函数