假设我有一个基类'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调用句柄函数?
答案 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 ++中的引用与常规指针几乎相同。