最近インタビューで聞かれました。コードを考えると:
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 が指す関数は?
ありがとう
最近インタビューで聞かれました。コードを考えると:
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 が指す関数は?
ありがとう
p2
関数ポインタではありません。関数ではなく、p2
によって割り当てられたメモリを指しているだけです。new B
Hmpf。p2はクラスBのインスタンスを指します。したがって、それはまた指すことができます
-実装固有であり、偶然に-関数gをポイントします(奇妙なキャストを適用した場合)、
しかし、これはかなり無意味です。p2はクラスBのインスタンスを指しているだけであり、必要に応じて、そのインスタンスのメソッドgを呼び出すことができます。さらに冒険心があれば、Bの基本クラスAのメソッドfのメソッドfを呼び出すこともできます。それ以外は実装に依存するだけで、意味がありません。
p2
関数ではなく のインスタンスを指しますclass B
。関数ポインタではないだけでなく(他の回答が指摘しているように)、それが指すアドレスは、ほとんどすべての実装の関数のアドレスでもありません。class B
非静的データ メンバーがある場合p2
、最初の非静的データ メンバーのアドレスとも一致します (ただし、そのタイプのオブジェクトへのポインターではないため、それを指しません!)。ただし、これはメンバー メソッドでは機能しません。メンバー関数ポインターはオブジェクトに依存しません。
インタビューでこんなナンセンスな質問をされるのはとても奇妙です。おそらく、インタビュアーは基本的なプログラミングについて無知であることを示したかったのでしょう。