关于this指针 虽然this指针大家已经很熟悉了,但是我这里讨论的关于this指针的问题可能大家还没注意过: 为了说明这个关于this的归属问题,我自写了一段再简单不过的程序,虽简单但具体: #include <iostream.h> class A { public: A *p1; int m_data1; int m_data2; A(){m_data1=1;m_data2=this->m_data1;p1=this;} void aa(){cout<<"A_aa"<<endl;} virtual void aaa(){cout<<"A_aaa"<<endl;} }; class B:public A { public: int m_data1; int m_data3; B(){} void print(){cout<<m_data2<<endl<<m_data1<<endl;} virtual void aaa(){cout<<"B_aaa"<<endl;} }; void main() { B b; b.print(); b.p1->aa(); b.p1->aaa(); b.p1->m_data3=0;//编译错### } 我的问题是指针p1是指向b自身吗? 一看程序,大家就知道:不是,p1指针是指向b的一个隐含父类A的。 对,答案对了(如果你对这一点也怀疑,那你只有自己到vc上试试了。), 在此,我也可以直接给一个证据,那就是上面的编译错,因为A中不存在m_data3。 你的答案其实说明我想要得的一个结论1,那就是this(程序中的)指针是指向A的。 但是,我想问既然p1是指向b的父类的,那么b.p1->aaa()应该调用的是那个函数呢? 答案是B中的那个,如果不是虚函数呢,结果就是A中的那个了(这从结论1中可知), 原来是虚函数捣的鬼,但是这是为什么呢? 虽然从一般意义上好像是这样,但是,P1指针自始至终都是指向A的吧?不是父类的指针指向子类的情况吧? 因为没有出现p1=&b的语句吧。:)
关于多态与虚函数 总结如下: 1)指针:父类的指针可以指向子类对象,但只能调用自身的成员函数和成员变量,除虚函数 外;子类的指针只能指向由父类显示类型转换为子类的对象,调用的是子类自身的 函数和变量,除虚函数外。 2)无指针(对象之间的类型转换):父类对象可以转化为子类对象,仍只能调有 自身的函数和变量,不能调用子类的函数和成员,与虚函数无关;子类对象不能显示 的转换为父类对象,除非人为编写相关代码。
即:虚函数必须与指针一起使用;除开虚函数之外,继承类之间的类型转换没有 什么直接作用。
对象生存方式
四种:stack、 heap、 global、 local static 产生方法: 第一种:在函数中,main()之内 第二种:new方法 第三种:在任何函数范围之外,由startup代码对其初始化。 第四种:在函数范围之内的静态对象

|