| class B { public: int flag; //为表示简洁,0代表基类,1代表派生类 void f(){cout<<”in B::f()”;} //非虚函数 }; class D:public B { public: void f(){cout<<”in D::f()”;} //非虚函数 }; void call_virtual(B* PB) { if(pb->flag==0) //如果是基类,则直接调用f pb->f(); //调用的是基类的f else //如果是派生类,则强制转化为派生类指针再调用f (D*)pb->f(); //调用的是派生类的f } |
| class B { public: void (*f)(); //函数指针,派生类对象可以通过给它重新赋值来改变对象的行为 }; class D:public B {}; void call_virtual(B* pb) { (*(pb->f))(); //间接调用f所指的函数 } void B_Mem() { cout<<”I am B”; } void D_Mem() { cout<<”I am D”; } int main() { B b; b.f=&B_Mem; //B_Mem代表B的“虚函数” D d; d.f=&D_Mem; //以D_Mem来覆盖(override)B的虚函数 call_virtual(&b); //输出“I am B” call_virtual(&d); //输出“I am D” } |
| 轻轻松松C to C++ (二) |
| PE文件格式详解(3) |
| C++中的const限定修饰符 |
| C语言之指针:数组和函数 |
| 使用C++和XML建立智能文档(一) |
| 浅谈C中的malloc和free |
| C++数据结构学习:递归(3) |
| 分形的乐趣之_Hilbert曲线 |
| 利用C++语言设计可扩展线程池 |
| C++数据结构学习:事件驱动模拟 |
| void f(B* PB) { pb->f1(); } |
| void f(B* pb) { DWORD* __vptr=((DWORD*)pb)[0]; //获得虚函数表指针 void (B::*midd_pf)()=__vptr[offsetof_virtual_pf1]; //从表中获得相应虚函数指针 (pb->*midd_pf)(); //调用虚函数 } |
| class B { B(){this->vf();} //调用B::vf virtual void vf(){cout<<”in B::vf()\n”; }; |
| public interface IFirst { void f1(); void f2(); } public interface ISecond { void s1(); } public class C:IFirst,Isecond { public override void f1(){} public override void f2(){} public override void s1(){} public virtual void c1(){} } |