/*
* 虚函数
* 没有使用虚函数,说明引用虚函数的目的
* Lzy2011-七夕
*/
#include
usingnamespace std;
staticint Line =1;
classCAnimal
{
protected:
char *name;
public:
CAnimal(char *na){
name = new char[strlen(na)+1];
strcpy(name, na);
}
void display(){cout
};
classCHerbivorous:public CAnimal
{
public:
CHerbivorous(char *na):CAnimal(na){}
void display(){cout
};
classCCarnivore:public CAnimal
{
public:
CCarnivore(char *na):CAnimal(na){}
void display(){cout
};
intmain(void)
{
CAnimal animal(""), *ptrAni;
ptrAni = &animal;
ptrAni->display();
CHerbivorous herb("小羊");
ptrAni = &herb;
ptrAni->display();
((CHerbivorous *)ptrAni)->display();
CCarnivore carn("老虎");
ptrAni = &carn;
ptrAni->display();
((CCarnivore *)ptrAni)->display();
return 0;
}
/*
* 虚函数
* Lzy2011-七夕
*/
#include
usingnamespace std;
staticint Line =1;
classCAnimal
{
protected:
char *name;
public:
CAnimal(char *na){
name = new char[strlen(na)+1];
strcpy(name, na);
}
virtual void display(){cout
};
classCHerbivorous:public CAnimal
{
public:
CHerbivorous(char *na):CAnimal(na){}
void display(){cout
};
classCCarnivore:public CAnimal
{
public:
CCarnivore(char *na):CAnimal(na){}
void display(){cout
};
intmain(void)
{
CAnimal animal(""), *ptrAni;
ptrAni = &animal;
ptrAni->display();
CHerbivorous herb("小羊");
ptrAni = &herb;
ptrAni->display();
((CHerbivorous *)ptrAni)->display();
CCarnivore carn("老虎");
ptrAni = &carn;
ptrAni->display();
((CCarnivore *)ptrAni)->display();
return 0;
}
/*
*虚函数的重载
*重载一个虚函数要求函数名、返回类型、参数个数参数类型以及参数的顺序都与基类中的原型相同,不能有任何的不同
* Lzy2011-七夕
*/
#include
#include
usingnamespacestd;
classPerson{
protected:
char*name;
public:
Person(char*n) {
name=newchar[strlen(n) + 1];strcpy(name,n);}
~Person() {delete[]name;}
virtualvoidprintInfo() {cout<
};
classWorker:publicPerson{
public:
Worker(char*n) :
Person(n) {
}
voidprintInfo() {
cout <
}
};
classTeacher:publicPerson{
public:
Teacher(char*n) :Person(n) {}
voidprintInfo() {
cout <
}
};
intmain(void) {
Workerw("小明");
Teachert("Lzy");
Person*p;
p = &w;
p->printInfo();
p = &t;
p->printInfo();
return0;
}
/*
*多继承中的虚函数
* Lzy2011-七夕
*/
#include
#include
usingnamespacestd;
classbase1
{
public:
virtualvoiddisplay(){cout<
};
classbase2
{
public:
voiddisplay(){cout<
};
classdervie:publicbase1,publicbase2
{
public:
voiddisplay(){cout<
};
intmain(void)
{
base1obj1, *ptr1;
base2obj2, *ptr2;
dervieobj3;
ptr1 = &obj1;
ptr1->display();
ptr1 = &obj3;
ptr1->display();//动态联编
ptr2 = &obj2;
ptr2->display();
ptr2 = &obj3;
ptr2->display();//静态联编
((dervie*)ptr2)->display();
return0;
}
/*
*多继承中的虚特性传递
* Lzy2011-七夕
*/
#include
#include
usingnamespacestd;
classA{
public:
virtualvoiddisplay() {
cout <
}
};
classbase1:virtualpublicA{
public:
voiddisplay() {
cout <
}
};
classbase2:virtualpublicA{
public:
voiddisplay() {
cout <
}
};
classdervie:publicbase1,publicbase2{
public:
voiddisplay() {
cout <
}
};
intmain(void) {
Aobj, *ptr;
base1obj1, *ptr1;
base2obj2, *ptr2;
dervieobj3;
ptr = &obj;ptr->display();
ptr1 = &obj1;ptr1->display();
ptr = &obj3;ptr->display();
ptr1 = &obj3;ptr1->display();
ptr2 = &obj3;ptr2->display();
return0;
}
/*
*虚析构函数
*基类的析构函数说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明
* Lzy2011-七夕
*/
#include
#include
usingnamespacestd;
classPerson{
protected:
char*name;
public:
Person(char*n) {name=newchar[strlen(n) + 1];strcpy(name,n);}
virtual~Person() {delete[]name;cout<
virtualvoidprintInfo() {cout<
};
classStudent:publicPerson{
private:
char*special;
public:
Student(char*n,char*s) :Person(n) {special=newchar[strlen(s) + 1];strcpy(special,s);}
~Student() {delete[]special;cout<
voidprintInfo() {
Person::printInfo();
cout <
}
};
intmain(void) {
Person*ptr1 =newPerson("李芸");
Person*ptr2 =newStudent("张雨","嵌入式");
Student*ptr3 =newStudent("崔健","计算机");
ptr1->printInfo();deleteptr1;
ptr2->printInfo();deleteptr2;
ptr3->printInfo();deleteptr3;
return0;
}
/*
*静态多态性是由函数重载、运算符重载来实现。
*动态多态性是通过虚函数来实现的
*/