C++学习笔记摘录八.docx
- 文档编号:2858530
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:22
- 大小:1.24MB
C++学习笔记摘录八.docx
《C++学习笔记摘录八.docx》由会员分享,可在线阅读,更多相关《C++学习笔记摘录八.docx(22页珍藏版)》请在冰豆网上搜索。
C++学习笔记摘录八
C++学习笔记
SkySeraph2010-7-31阅读整理
摘自:
接7C++学习笔记
1:
#include
usingnamespacestd;
classA
{
public:
intGet()
{
return1;
}
};
classB:
publicA
{
public:
intGet()
{
return2;
}
};
intmain()
{
Aa;
intone;
one=a.Get();
cout<<"类A的值为:
"< Bb; one=b.Get(); cout<<"类B的值为: "< return0; }//以上代码就是在编译时的静态联编他是在编译时就把各个的值给赋值完成了,而不需要人们手动去做,所以我们看到的是他直接输出的值。 2: #include usingnamespacestd; classA { public: intGet() { return1; } }; classB: publicA { public: intGet() { return2; } }; voidmain() { while (1) { cout<<" (1)为父类, (2)为子类,(3)为退出: "; intchoice; A*p;//1-2这里被指定了类A所以当你编译完成后这个值就是1了他是静态的是不可被改变和修改的。 如果是B那么他就是输出的2就个就是运行时的静态联编。 cin>>choice; boolExitPro=false; switch(choice) { case1: p=newA; break; case2: p=newB; break; case3: ExitPro=true; break; default: cout<<"请输入1-3的整数...\n"; } if(ExitPro==true) { break; } cout< 无论是输入1还是2都是返回的1这是因为1-2 } } 3: #include usingnamespacestd; classA { public: virtualintGet()//动态联编的实现是把我们要绑定的那个函数声明为虚函数比如这个。 只要设置为虚函数就可以在下面的运行过程中对对象的赋值进行操作! { return1; } }; classB: publicA { public: intGet() { return2; } }; voidmain() { while (1) { cout<<" (1)为父类, (2)为子类,(3)为退出: "; intchoice; A*p; cin>>choice; boolExitPro=false; switch(choice) { case1: p=newA;//1-2在这两个case中他的赋值操作是正常的因为是虚函数所以才能被程序允许赋值如果不是虚函数那么这里是无法执行的 break; case2: p=newB; break; case3: ExitPro=true; break; default: cout<<"请输入1-3的整数...\n"; } if(ExitPro==true) { break; } cout< 。 这个就是动态联编的作用! 1-2 } } 4: #include usingnamespacestd; classA { public: virtualintGet() { return1; } }; classB: publicA { public: intGet() { return2; } }; voidmain() { while (1) { cout<<" (1)为父类, (2)为子类,(3)为退出: "; intchoice; Ap;//这里把指针P改为对象P cin>>choice; boolExitPro=false; switch(choice) { case1: p=A(); break; case2: p=B(); break; case3: ExitPro=true; break; default: cout<<"请输入1-3的整数...\n"; } if(ExitPro==true) { break; } cout< 这个和静态的是一样的了 } } 5: #include usingnamespacestd; classFather { public: virtualvoidRun()const { cout<<"父亲可以跑一万米...\n"; } }; classSon: publicFather { public: voidRun()const { cout<<"儿子可以跑十万米...\n"; } }; classDaughter: publicFather { public: voidRun()const { cout<<"女儿可以跑五万米...\n"; } }; voidOne(Father);//分别申明三个函数并且接受他们的这个是接受对象 voidTwo(Father*);//接受Father的指针 voidThree(Father&);//和别名引用。 intmain() { Father*p=0; intchoice; boolquit=false; while (1) { cout<<"(0)退出, (1)儿子, (2)女儿,(3)父亲: "; cin>>choice; switch(choice) { case0: quit=true; break; case1: p=newSon; One(*p);//这里调用下面的one(fatherone)这个函数并把指针p当作参数传递到函数里面然后在执行one.run下同 break; case2: p=newDaughter; Two(p);//由于TWO已经是指针所以不需要在前面加* break; case3: p=newFather; Three(*p); break; default: cout<<"请输入0-3之间的数字\n"; break; } if(quit==true) { break; } } return0; } voidOne(FatherOne)//以对象方式调用输出时由于他没有用到指针或者引用所以他没有起到多态性的作用 { One.Run(); } voidTwo(Father*Two)//以指针方式调用 { Two->Run(); } voidThree(Father&Three)//以别名方式调用 { Three.Run(); } 6: #include usingnamespacestd; classA { public: virtualintGet() { return0; } }; classB: publicA { public: intGet() { return1; } }; voidmain() { Bb; B*p=&b; cout< 但是我们可以用以下方法解决这个问题。 cout< : Get()< } 7: #include usingnamespacestd; classA { public: A() { cout<<"创建A...\n"; } virtualvoidGet() { cout<<"函数GETA...\n"; } virtual~A()//如果这里没有virtual那么他会只会销毁基类的了从而B的对象的内存被驻留了 { cout<<"虚析构A...\n"; } }; classB: publicA { public: B() { cout<<"创建B...\n"; } voidGet()//由于存在继承关系所以析构和GET就算不写VIRTUAL也会被继承。 。 。 { cout<<"函数GETB...\n"; } ~B() { cout<<"虚析构B...\n"; } }; voidmain() { A*p=newB; p->Get();//从结果中我们看到先按照以前的顺序创建A在创建B(以前说过不在解释。 )然后由于这个是虚函数所以他会指向正确的类中进行成员调用。 输出B的函数GET然后在销毁B在销毁A这个结果是正确的。 这就证明了当派生类的对象被销毁或者调用时他会首先调用基类的在调用派生类的相反,当派生类的对象销毁时,他会首先销毁派生类的对象在销毁基类的从而达到全部销毁 deletep; }//最后建议: 如果基类中定义了虚函数,析构函数也应该说明为虚函数,这样对内存的回收会更准确些! 新章节: 数组 1: #include usingnamespacestd; voidmain() { inta[10];//定义一个数组名为A的整数型变量,他的元素有10个 inti; for(i=0;i<10;i++) { a[i]=i;//把i的变量值赋值给a[i]中的i cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 学习 笔记 摘录
![提示](https://static.bdocx.com/images/bang_tan.gif)