关于虚函数问题

因为C::f跟A::f的返回值和参数类型都一样,A::f又有virtual,所以自动带上了virtual。如果你用clang++编译的话,他会告诉你你忘记写override,不让你过。还有,*cp的类型不是A,是A\u0026amp;
■网友
这正是虚函数存在的意义——动态绑定啊基类的引用和指针会在运行时根据其绑定对象的实际类型决定调用基类还是派生类的虚函数你的基类A类定义了一个虚函数f(),那么在A的所有派生类中f()都是虚的。你用基类A的指针new了一个C类对象,该对象的实际类型是C,这个指针调用f()的时候触发了动态绑定而f2()不是虚函数,不存在动态绑定,你相当于用一个基类(A)对象调用派生类(C)成员,当然会报错。这段代码根本就是用来讲虚函数的示例嘛(⊙?⊙)
■网友
不光是指针,引用同样可以触发多态。比如C c;A\u0026amp; a = c;a.f();//应该输出c
■网友
因为cp 会在虚函数表中找到子类函数的地址然后调用
■网友
1.子类对父类中的虚函数重定义时(方法名,参数个数与类型,返回值都必须一样,否则被认为是重载),不论写不写关键字virtual,该函数都被认为是虚函数;2.父类指针指向子类对象,调用virtual方法,标准的动态绑定,所以(*cp).f()输出c;3.通过父类指针指向子类对象,该指针只能访问子类对象中的父类部分,不能访问子类新增的部分。
■网友
学习 OOP,用 C++ 太陡了,为什么不学习C# Java呢。


    推荐阅读