64,637
社区成员
发帖
与我相关
我的任务
分享
C obj,&ref =obj,*ptr=&obj;
obj.C::fun();
ref.C::fun();
ptr->C::fun();
//这种跟多态无关,无论虚函数,非虚函数,直接调用
2)对象调用方式
2.1)直接用对象调用
C obj;
obj.fun(); //这种,都是编译为直接调用函数,跟多态无关
2.2)通过引用调用
C obj;
C &ref=obj;
ref.fun(); //这种方式调用虚函数,可以显式实现多态
//非虚函数,则编译为直接调用函数,不是实现多态的途径
2.3)通过指针调用
C obj;
C* ptr =&obj;
ptr->fun(); //和引用相同。/这种方式调用虚函数,可以显式实现多态
//非虚函数,则编译为直接调用函数,不是实现多态的途径
在类的成员函数内部:
类的非静态成员函数内部
fun(), 只有函数名调用函数,
fun()相当于 this->fun();
带类名 C::fun();相当于 this->C::fun();
类的静态成员函数,类外部函数,调用
只有 静态函数,可以直接调用 fun () 相当于 C::fun();
非静态成员函数,必须通过对象调用,obj.fun(),或者 obj.C::fun();
ref.fun(),或者 ref.C::fun()
ptr->fun();ptr->C::fun();
直接用函数名,调用非静态成员函数(不显式通过对象,指针,引用,类名):
a)构造函数,析构函数 内直接调用非静态成员函数(不显式通过对象,指针,引用),都是编译为直接调用函数
这其实跟 this->C::fun() ;相同
b)其他非静态函数内部,只有函数名调用函数, fun()相当于 this->fun();
这种情况,可以隐式实现多态。