我知道这个问题必须被覆盖无尽的时间,但我已经搜索了以前的问题,没有任何东西似乎弹出。在超类的子类中调用虚函数
这是关于继承和虚函数我C++。我在调用超类的子类中的虚函数时遇到了问题。
让我举个例子。从三个类开始,它们相互继承。
class A {
void foo() { bar() }
virtual void bar() { }
};
class B : public A {
virtual void bar() { }
};
class C : public B {
virtual void bar() { // do something }
};
现在我想要一个声明为B *的变量,但实例化为C *。当我这样做,并在myObject上调用foo(),然后A :: foo()调用bar()。但是只调用B :: bar(),而不是C :: Bar() - 实际上myObject是这样的,即使它被声明为B,这又会影响“//不做任何事”不会被执行。
我该如何告诉A :: foo(),它需要看最低的实现?
有意义吗?
// Trenskow
编辑:
Ç:: foo是没有问题的。 Foo被称为A级,因为它是唯一实施的地方。问题出现时,A:Foo调用Bar()。然后B:Bar被调用,而不是C :: Bar。
也许问题是,在我的实现,我只得到一个void *指针对象A.
像这样:
void A:Foo(void *a) {
A* tmpA = static_cast<A*> (a);
tmpA->bar();
}
现在,编译器认为,这TMPA是答:但不知何故,它设法确定它是一个B *,并且调用B :: Bar,实际上tmpA是一个C *,它应该调用C :: Bar。
如果你发布了真实的代码,那么我们可以告诉问题是。你不需要做任何特别的事情。如果语法错误得到解决,代码('myObject-> foo();')将调用'C :: bar()'。 – UncleBens 2010-08-22 09:23:20
......但是如果我猜测,要么'C'并没有真正覆盖'bar'(具有不同的签名),或者你在某处切分对象(通过执行诸如'* variable = * myObject;' – UncleBens 2010-08-22 09:33:21
我仍然不会购买它,为什么不调用C :: bar()?你能发布实际的代码吗? – EboMike 2010-08-22 09:43:17