C++学习笔记摘录八Word文档格式.docx
《C++学习笔记摘录八Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++学习笔记摘录八Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
}
};
classB:
publicA
return2;
intmain()
Aa;
intone;
one=a.Get();
cout<
<
"
类A的值为:
one<
endl;
Bb;
one=b.Get();
类B的值为:
return0;
}//以上代码就是在编译时的静态联编他是在编译时就把各个的值给赋值完成了,而不需要人们手动去做,所以我们看到的是他直接输出的值。
2:
voidmain()
while
(1)
(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;
case3:
ExitPro=true;
break;
default:
请输入1-3的整数...\n"
if(ExitPro==true)
p->
Get()<
//大家可以从这条输出结果看到。
无论是输入1还是2都是返回的1这是因为1-2
3:
virtualintGet()//动态联编的实现是把我们要绑定的那个函数声明为虚函数比如这个。
只要设置为虚函数就可以在下面的运行过程中对对象的赋值进行操作!
//1-2在这两个case中他的赋值操作是正常的因为是虚函数所以才能被程序允许赋值如果不是虚函数那么这里是无法执行的
//现在从这个结果中大家看到显示的是正常的了。
。
这个就是动态联编的作用!
1-2
4:
virtualintGet()
Ap;
//这里把指针P改为对象P
p=A();
p=B();
p.Get()<
//修改后的效果可以看到如果没有在虚函数中使用指针或者引用那么就无法实现动态联编。
这个和静态的是一样的了
5:
classFather
virtualvoidRun()const
父亲可以跑一万米...\n"
classSon:
publicFather
voidRun()const
儿子可以跑十万米...\n"
classDaughter:
女儿可以跑五万米...\n"
voidOne(Father);
//分别申明三个函数并且接受他们的这个是接受对象
voidTwo(Father*);
//接受Father的指针
voidThree(Father&
);
//和别名引用。
Father*p=0;
boolquit=false;
while
(1)
(0)退出,
(1)儿子,
(2)女儿,(3)父亲:
switch(choice)
case0:
quit=true;
p=newSon;
One(*p);
//这里调用下面的one(fatherone)这个函数并把指针p当作参数传递到函数里面然后在执行one.run下同
p=newDaughter;
Two(p);
//由于TWO已经是指针所以不需要在前面加*
p=newFather;
Three(*p);
请输入0-3之间的数字\n"
if(quit==true)
voidOne(FatherOne)//以对象方式调用输出时由于他没有用到指针或者引用所以他没有起到多态性的作用
One.Run();
voidTwo(Father*Two)//以指针方式调用
Two->
Run();
voidThree(Father&
Three)//以别名方式调用
Three.Run();
6:
B*p=&
b;
//这里由于是动态联编就算你把B改成A也会输出B的值因为他会自动根据情况而判定指向正确的虚函数。
但是我们可以用以下方法解决这个问题。
A:
:
//使用成员名限定可以强制把动态联编改为静态联编大家看到输出的是0就是证明了这个语句
7:
A()
创建A...\n"
virtualvoidGet()
函数GETA...\n"
virtual~A()//如果这里没有virtual那么他会只会销毁基类的了从而B的对象的内存被驻留了
虚析构A...\n"
B()
创建B...\n"
voidGet()//由于存在继承关系所以析构和GET就算不写VIRTUAL也会被继承。
函数GETB...\n"
~B()
虚析构B...\n"
A*p=newB;
Get();
//从结果中我们看到先按照以前的顺序创建A在创建B(以前说过不在解释。
)然后由于这个是虚函数所以他会指向正确的类中进行成员调用。
输出B的函数GET然后在销毁B在销毁A这个结果是正确的。
这就证明了当派生类的对象被销毁或者调用时他会首先调用基类的在调用派生类的相反,当派生类的对象销毁时,他会首先销毁派生类的对象在销毁基类的从而达到全部销毁
deletep;
}//最后建议:
如果基类中定义了虚函数,析构函数也应该说明为虚函数,这样对内存的回收会更准确些!
新章节:
数组
inta[10];
//定义一个数组名为A的整数型变量,他的元素有10个
inti;
for(i=0;
i<
10;
i++)
a[i]=i;
//把i的变量值赋值给a[i]中的i