0

Let's say I have a base class 'A' and two classes 'B' and 'C', which are derived from the base class 'A'

I know I can do this

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. 

Then it will call the handle function from either B or C object.

But, I have a restriction that I cannot use a pointer in my program. I have to define A as

A a //not A *a

Then how do I implement this so that it calls the handle function from class B or C?

4

3 回答 3

3

你不能。你不能取一个类型的值A并假装它是一个B. 这很糟糕,而且无法做到。

于 2012-06-12T00:16:13.870 回答
1

奇怪的问题。它不能。不是以任何理智的方式。毕竟是'A'。

假设您知道“我想调用 C 的 virt”,您可能会做一些令人不安的事情,例如:

#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'。

于 2012-06-12T00:23:37.327 回答
0

如果这是家庭作业,那么教授可能打算使用引用 (&) 而不是纯指针 (*)。

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

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

于 2012-06-12T00:21:00.053 回答