- 构造函数与析构函数一个重要的职能或特点是类型确定,即进入函数时,先修改虚表指针,所以在其中对虚函数的调用不是运行时确定的(编译器的实现是直接调用,即不通过虚表)
- 成员函数指针形式的调用是动态的(TODO 成员函数指针的实现)
- 带域的调用形式是编译期确定的
#include <iostream>
using namespace std;
class A {
public:
int i;
A() { foo(); }
~A() { foo(); }
void func() { cout << "A::func()" << endl; }
virtual void f() { cout << "A::f()" << endl; }
virtual void foo() { cout << "A::foo()" << endl; }
virtual void foooo() {
cout << "A::foooo()" << endl;
f();
A::f();
}
};
class B : public A {
public:
B() { foo(); }
~B() { foo(); }
void f() { cout << "B::f()" << endl; }
void foo() { cout << "B::foo()" << endl; }
void foooo() {
cout << "B::foooo()" << endl;
f();
A::f();
}
};
int main() {
B b;
B *bp = &b;
A *ap = &b;
ap->foo();
(*ap).foo();
ap->A::foo();
void (A::*Afoop)() = &A::foo;
(ap->*Afoop)();
printf("%08x\n", &B::f);
printf("%08x\n", &B::func);
ap->foooo();
ap->A::foooo();
return 0;
}