//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()),因此这条函数调用语句就是多态的。 */