1、;class B:public Areturn 2;int main()A a;int one;one=a.Get();cout类A的值为:onechoice;bool ExitPro=false;switch(choice)case 1:p=new A;break;case 2:p=new B;case 3:ExitPro=true; break;default:请输入1-3的整数.nif (ExitPro=true)p-Get()/大家可以从这条输出结果看到。 无论是输入1还是2 都是返回的1 这是因为 1-23:virtual int Get()/动态联编的实现是把我们要绑定的那个函数声
2、明为虚函数 比如这个。 只要设置为 虚函数 就可以在下面的运行过程中对对象的赋值进行操作!/1-2 在这两个 case中他的赋值操作是正常的 因为是虚函数 所以才能被程序允许赋值 如果不是虚函数 那么这里是无法执行的/现在从这个结果中大家看到 显示的是正常的了。这个就是动态联编的作用!1-24:virtual int Get()A p;/这里把指针P 改为对象Pp=A();p=B();p.Get()Run();void Three(Father &Three)/以别名方式调用Three.Run();6:B *p=&b;/这里由于是动态联编 就算你把B改成 A 也会输出 B的值 因为他会自动根据
3、情况而判定指向正确的虚函数。但是我们可以用以下方法解决这个问题。A:/使用成员名限定 可以强制把动态联编改为静态联编 大家看到 输出的是0 就是证明了这个语句7:A()创建A.nvirtual void Get()函数GET A.nvirtual A()/如果这里没有 virtual 那么他会只会销毁 基类的了 从而 B的对象的内存被驻留了虚析构A.nB()创建B.nvoid Get()/由于存在继承关系 所以 析构和 GET就算不写 VIRTUAL 也会被继承。函数GET B.nB()虚析构B.nA *p=new B;Get();/从结果中我们看到 先按照以前的顺序创建 A 在创建B (以前说过不在解释。)然后由于这个是虚函数 所以他会指向正确的类中进行成员调用。输出B的 函数GET 然后在销毁B 在销毁A 这个结果是正确的。这就证明了 当派生类的对象被销毁或者调用时 他会首先调用基类的在调用派生类的 相反,当派生类的对象销毁时,他会首先销毁派生类的对象在销毁基类的 从而达到全部销毁delete p;/最后建议:如果基类中定义了虚函数,析构函数也应该说明为虚函数,这样对内存的回收会更准确些!新章节:数组int a10;/定义一个数组名为A的整数型变量,他的元素有10个int i;for (i=0;i10;i+)ai=i;/把 i 的变量值赋值给 ai中的i