欢迎来到天天文库
浏览记录
ID:27842465
大小:48.50 KB
页数:3页
时间:2018-12-06
《类中虚函数的调用以及继承的过程中函数的作用域问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、类中虚函数的调用以及继承的过程中函数的作用域问题C卄中多态性的体现就是通过继承而相关联的指向基类的指针或者引用。C++中的函数默认不使用动态绑定,所谓的动态绑定是指在在程序的运行阶段能够确定指针以及引用所绑定的类型。如果要触发动态绑定必须满足的两个条件是:1.在基类中,函数必须是虚函数,即,函数前面有关键字Virtual;2.必须通过指向基类的指针或者引用进行函数调用;对于每个派牛类而言都包含了其所继承的基类部分,所以可以将基类类型的引用或者指针绑定到基类对象,同时可以以绑定到派生类对象。例如:structA{voidfoo(){print
2、f("A_foo");}virtualvoidbar(){printf(,,A_bar,/);}private:inti;};structB:A{voidbar(int){printf("B_bar");)voidfoo(){printfCB_foo/z);}};structC:B{voidfoo(){printf("Cfoo");}voidbar(double){printf(,,C_bar_T,);}voidbar(){printf("C_bar_2");}private:intj;};intmain(){Aaboj;Bbobj;Cc_
3、obj;A*tcst_ptr;testptr=&bobj;//基类类型的指针指向派生类型的对■象test_ptr->foo();〃输出A_fooprintf(〃〃);testptr~>bar();//输出Abarprintf("");//test^lptr->bar(l);//错误,通过指向基类类型的指针或者引用只能调用对象的基类部分,但是在A屮并没有定义bar(int)//函数//bobj.barO;//错误,根据函数的作用域规则以及函数调用的查找规则(函数调用时首先在当前的作用域屮查找名字调用失败bobj.A::bar();//
4、正确,虽然bar(int)屏蔽掉/bar(int),但是印卜仍然含有bar()函数,但是通过B类类型的对象不能调用该函数;可以使用作用域操作符调用printf(〃〃);b_obj.bar(l);//正确,通过bobj这个B类的对象只能调用B屮定义的bnr,但足屏蔽掉了A中定义的bar,这里不是重载;//函数的重载必定是在相同的作用域中完成printf("");test_ptr二&c_obj;testptr->foo();printf("");testptr->bar();printf("");c_obj.bar(1.2);p
5、rintf(〃〃);cobj.B::bar(1);printf("");c_obj.A::bar();printf("");}默认情况下,struct的继承为公有继承public,class的继承为私有继承private。定义了三个类A,B,C,且C继承B,B继承A。函数中声明了A,B,C类的三个对象以及一个指向A类类型的指针test_ptr.类A中定义了两个公有成员函数,voidfoo()以及virtualvoidbar(),bar()为一个虚函数,可以通过指向基类类型的指针或者引用调用该函数。采用动态绑定的方式通过指向基类类
6、型的指针或者是引用来调用虚函数,但是如果不是虚函数,则采用静态方式调用函数,如foo()。非虚函数:test_ptr=&bobj;tcst_ptr->foo();test_ptr是指向基类的指针,但是因为每个派生类对象都包含这基类部分,所以可以将基类类型的引用绑定到派牛类对象的基类部分,也可以用指向基类类型的指针指向派生类的对象。但是对于非虚函数而言,在编译的阶段就已经确定了指针的类型指向基类的部分(So为非虚函数,根据指针前面的说明符就可以确定要调用的函数),这存在一个从派牛类到基类的转换问题.因为可以使用基类的指针或者引用来引用派生类的
7、对象,所以,使用基类类型的指针或者引用吋,不知道指针或者引用所绑定的对象:基类类型的引用或指针可以引用基类类型对象,也可以引用派生类型对象。无论此时的实际对象具有那种类型,编译器都把它当做基类类型对象。将派生类的类型对象当做基类类型对象是安全的,因为,每个派生类型的对象都拥有基类子对象,派生类也继承了基类的操作,即,任何可以在基类对象上执行的操作也可以通过派生类对象执行。如果调用非虚函数,则无论实际对象使什么类型的,都执行基类类型所定义的函数。(调用什么函数这是由编译阶段确定的,而不是在运行的阶段)Virtual函数:将C++中的基类类型的
8、引用或者指针绑定到派生类对象,对派生类对象本身没有影响,对象本身仍为派生类的对象。对象的实际类型可能不同于该对象引用或者指针的静态类型,这是C++中动态绑定的关键。test_pt
此文档下载收益归作者所有