C++ 文章备份

2017-01-04 10:31:34来源:作者:Claire‘s Wallet人点击

第七城市
虚函数父类子类的相互调用总结 虚函数父类子类的相互调用总结

1、对象函数调用时会向函数传递一个this指针。函数中再调用其它成员函数就会使用此this指针,虚函数就是通过这个指针起效的,即:根据指针指向的类型进行动态绑定调用对应的虚函数。但是有一个优先原则:如果所调用的函数不是虚函数,就会直接就近调用本类的此函数,不会考虑子类,如果被调函数是虚函数,那么就会根据传入的this指针来差虚表,这个this指针始终都是最外层调用时传入的指针。

所以:

class A { public : A() { s = 1; } virtual void fun() //无论这里有没有virtual结果都一样,因为传递了this是B类型的 { cout<< "A::fun()"<<":" <<s<<endl; fun1(); } virtual void fun1()//这个virtual一旦去掉,就会调用此函数,最后输出A::fun1(),此为就近 { cout<<"A::fun1()"<<endl; } int s; }; class B : public A { public : B() { s = 2; } void fun1() { cout<< "B::fun1()"<<endl; } }; int main() { B b; b.fun(); int s; cin>>s; return 0; }

输出为:

A::fun():2

B::fun1()

优先原则的例子情况:

class A { public: A() { s = 1; } virtual void fun() { cout<< "A::fun()"<<":" <<s<<endl; fun1(); } void fun1() { cout<< "A::fun1()"<<endl; fun2(); } virtual void fun2()//此处加virtual与不加结果截然不同那个 { cout<< "A::fun2()"<<endl; } int s; }; class B : public A { public: B() { s = 2; } void fun() { fun1(); } /* void fun1() { cout<<"B::fun1()"<<endl; } */ void fun2() { } }; int main() { A* b= new B(); b->fun(); int s; cin>>s; return 0;}

第19行,加上virtual之后,输出:

A::fun1()

不加输出:

A::fun1()

A::fun2()

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台