我有一个类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;
}
答案 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)
virtual
关键字声明基类函数声明。 virtual
关键字,则在内存中使用虚拟表,它会处理对类链的大多数派生函数的调用。如需更多理解,请阅读以下内容: