我最近在一次采访中被问到这个问题。鉴于代码:
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指向哪个函数?
由于
答案 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
也将与第一个非静态数据成员的地址重合(但它不会指向它,因为它不是指向该类型对象的指针!)。但是,这对成员方法不起作用:成员函数指针不依赖于对象。
在采访中有这样一个无意义的问题很奇怪。也许采访者想表现出他们对基本节目的无知。