C++成员函数中调用虚函数
//program15.4.1.cpp成员函数中调用虚函数 #include < iostream > using namespace std; class CBase { int a = 0; public: void func1() {/*此时this为CBase* {CDerived} 类型*/ /*注意到,尽管基类的指针类型是基类的(都告诉你是“基类”指针了,但由于它也兼容其派生类对象的指针(这并不矛盾,因为派生类也是基类(就比如说,🐕类派生出哈巴狗类,说(所有)哈巴狗(都是)狗 也ok的(但不能够反过来说够都是哈巴狗) 因此在调试的时候,观察到的this指针的类型要小心它即像基类型又像派生类型*/ cout << "sizeof(*this)=" << sizeof(*this) << endl;/*此为第一次打印的sizeof(*this)=8*/ cout << "this_before_func2:"<<this << endl; //func2();//location_2;func2也是某个类的成员函数,它的调用也需要某个对象类出发,这里的对象就是this所指的对象出发的即this->func2()<==>(*this).func2() /*version_2;运行结果一样的.*/ (*this).func2(); cout << "this_after_func2:"<<this << endl; cout << "sizeof(*this)=" << sizeof(*this)<<endl;/*第三次打印的sizeof(*this)=8*/ } /**/ virtual void func2() { cout << "sizeof(*this)=" << sizeof(*this); cout << "CBase:: func2()" << endl; }; }; /*func1不是序函数,func2是虚函数;*/ class CDerived: public CBase { int b = 1; /*先从CBase那里继承过来所有成员.*/ public: virtual void func2() { cout << "this_in_func2:"<<this << endl; cout << " CDerived:func2()" << endl; cout << "sizeof(*this)=" << sizeof(*this)<<endl;/*第二次打印的sizeof(*this)=12 */ } }; int main() { CDerived d; cout << "&d=" << &d << endl; d.func1(); return 0; } /*运行结果: sizeof(*this)=8 CDerived:func2() sizeof(*this)=12 sizeof(*this)=8 */ /*d.func1成员函数,进入func1函数,调用了func2 函数, 看上去应该调用的是CBase类的func2,但输出结果证明了实际上调用的是CDerived类的func2。 1.知道this->func2()是多态语句 2.this->派生类型(从this表示的地址检测与调用他们的派生类对象d的值的比较中) 虽然观察到的this始终指向的是派生类,但这不代表this的类型最开始就一定不是基类型,基类型指针兼容派生类对象的地址,容易让人感觉this自始至终是派生类型,(基类型的this所指的那个内存地址里,可能存的是基类型对象,也可能是派生类对象; 在基类的func1函数中,“func2();”等价于“this-> func2();”, (调试的时候看this(或*this)的类型可能有疑惑,由于sizeof的及算方式不够动态,所以看this的地址和最初的那个引起调用的派生类对象d的地址作比较发现,this刚开始=&d;执行func2()时,this的值变化了,进入到func2()的函数体中时,this的值回到&d了。) */
//program15.4.1.cpp成员函数中调用虚函数 #include < iostream > using namespace std; class CBase { int a = 0; public: void func1() {/*此时this为CBase* {CDerived} 类型*/ cout << "sizeof(*this)=" << sizeof(*this) << endl;/*此为第一次打印的sizeof(*this)=8*/ func2();//location_2; cout << "sizeof(*this)=" << sizeof(*this)<<endl;/*第三次打印的sizeof(*this)=8*/ virtual void func2() { cout << "sizeof(*this)=" << sizeof(*this); cout << "CBase:: func2()" << endl; }; }; class CDerived: public CBase { int b = 1; /*先从CBase那里继承过来所有成员.*/ public: virtual void func2() { cout << " CDerived:func2()" << endl; cout << "sizeof(*this)=" << sizeof(*this)<<endl;/*第二次打印的sizeof(*this)=12 */ } }; int main() { CDerived d; d.func1(); return 0; } /*运行结果: sizeof(*this)=8 CDerived:func2() sizeof(*this)=12 sizeof(*this)=8 */ /*d.func1成员函数,进入func1函数,调用了func2 函数, 看上去应该调用的是CBase类的func2,但输出结果证明了实际上调用的是CDerived类的func2。 这是因为在func1函数中,“func2();”等价于“this-> func2();”, 而此时进入到基类的this 指针显然是CBase*类型的,(调试的时候看this(或*this)的类型可能有疑惑,可以打印sizeof来看区别当前this所指对象类型(分别为基类和派生类设置一个成员变量,以便比较)即是一个基类指针,那么“this->func2();"这样的语句就是在通过基类指针调用虚函数(基类和派生类具有同名,同参数列表的虚函数func2()),因此这条函数调用语句就是多态的。 */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-07-31 c++函数返回值类型是否为引用的比较
2022-07-31 java_查询从控制台输入的字符的ASCII码值(每行一个,-1结束)