К вопросу о вопросах по C++
31/1/06 13:16Продолжаем набивать журнал контентом.
Что будет, если указателю на функцию-член присвоить указатель на виртуальный метод предка, а потом вызвать её на экземпляре потомка?
А для невиртуальной функции?
И на gcc, и на MSVC выдаёт одно и то же:
Вывод интересен: указатель на функцию-член хранит И индекс в VMT, И указатель на функцию. Ну и флаг, указывающий, что именно хранится.
Что будет, если указателю на функцию-член присвоить указатель на виртуальный метод предка, а потом вызвать её на экземпляре потомка?
А для невиртуальной функции?
#include <iostream>
class A
{
public:
virtual void f() { std::cout << "A::f()\n"; };
void g() { std::cout << "A::g()\n"; };
};
class B : public A
{
public:
virtual void f() { std::cout << "B::f()\n"; };
void g() { std::cout << "B::g()\n"; };
};
typedef void (A::*VirtualFunctionPointer) ();
int main()
{
A a;
B b;
B* pb = &b;
VirtualFunctionPointer p = &A::f;
(pb->*p) ();
p = &A::g;
(pb->*p) ();
return 0;
}
И на gcc, и на MSVC выдаёт одно и то же:
B::f()
A::g()Вывод интересен: указатель на функцию-член хранит И индекс в VMT, И указатель на функцию. Ну и флаг, указывающий, что именно хранится.
Tags:
(no subject)
1/2/06 07:20 (UTC)(no subject)
1/2/06 07:52 (UTC)P.S. наверно я вас достал своими постами, звыняйте... :-)