函数由派生类指针指向

时间:2012-11-24 21:59:58

标签: c++ inheritance

我最近在一次采访中被问到这个问题。鉴于代码:

class A{
    public:
       void f() { cout << "f in A" << endl; }
};

class B : public A{
    public:
       void g() { cout << "g in B" << endl; }
};

int main()
{
    B *p2 = new B;    
}

指针p2指向哪个函数?

由于

3 个答案:

答案 0 :(得分:2)

p2不是函数指针。 p2只是指向new B分配的内存,而不是函数。

答案 1 :(得分:1)

哼。 p2指向B类的实例。所以它也可以指向

- 特定实现和意外 - 指向函数g(如果你应用了一些奇怪的演员),

但这是毫无意义的。 p2只指向B类的实例,如果愿意,可以调用该实例方法g。如果你更冒险,你甚至可以调用B的基础A方法f的方法f。其他任何东西都只是依赖于实现,没有任何意义。

答案 2 :(得分:0)

p2不指向函数,而是指向class B的实例。它不仅不是函数指针(正如其他答案所指出的那样),而且它指向的地址也不是几乎任何实现中任何函数的地址。如果class B具有非静态数据成员,p2也将与第一个非静态数据成员的地址重合(但它不会指向它,因为它不是指向该类型对象的指针!)。但是,这对成员方法不起作用:成员函数指针不依赖于对象。

在采访中有这样一个无意义的问题很奇怪。也许采访者想表现出他们对基本节目的无知。