如何从静态分配的对象调用虚函数?

时间:2012-06-12 00:11:04

标签: c++ virtual-functions

假设我有一个基类'A'和两个'B'和'C'类,它们来自基类'A'

我知道我可以做到这一点

A *a = new B();
or
A *a = new C();
a->handle() //handle is a virtual function in A. class B and C overloaded this function and added its own implementation. 

然后它将从B或C对象调用handle函数。

但是,我有一个限制,我不能在我的程序中使用指针。我必须将A定义为

A a //not A *a

然后我该如何实现它,以便它从类B或C调用句柄函数?

3 个答案:

答案 0 :(得分:3)

你做不到。您不能使用A类型的值并假装它是B。这很糟糕,无法完成。

答案 1 :(得分:1)

奇怪的问题。它不能。不是任何理智的手段。这是'A'毕竟。

假设你知道'我想打电话给C',那么你可以做些令人不安的事情:

#include <stdio.h>

class A { public: virtual int foo() { return 1; } };
class B : public A{ public: virtual int foo() { return 2; } };
class C : public A{ public: virtual int foo() { return 3; } };

int main()
{
    A a;
    C *c = (C*)&a;
    int x = c->C::foo();  // EXAMPLE 1
    printf("x == %d\n", x);

    x = ((C&)a).C::foo(); // EXAMPLE 2

    printf("x == %d\n", x);
    return 0;
}

请注意,示例2与中间没有任何内容完全相同。更难读,但结果相同。

关键是使用C :: foo();如果没有C ::,您将浏览虚拟表,结果将为“1”。

答案 2 :(得分:0)

如果这是家庭作业,那么也许教授意味着使用引用(&amp;)而不是纯指针(*)。

A &a = * new B();
or
A &a = * new C();
a.handle()

虽然C ++中的引用与常规指针几乎相同。