1、基类的构造函数与析构函数不能被继承
派生类构造函数的一般形式如下:
派生类名::派生类名(参数总表):基类名1(对象参数表1),基类名2(对象参数表2),...,内嵌对象名m(对象参数表m)
{
派生类新增成员的初始化;
}
//完整代码如下:
#include<iostream>
#include<string.h>
using namespace std;
class Person
{
char Name[10];
int Age;
public:
Person(char*name,int age){
strcpy(Name,name);
Age=age;
cout<<"constructor of person"<<Name<<endl;
}
~Person(){
cout<<"deconstructor of person"<<Name<<endl;
}
};
class Emplpoyee:public Person
{
char Dept[20];
Person Leader;
public:
//派生类要重新构造
Emplpoyee(char*name,int age,char*dept,char*name1,int age1)
:Person(name,age), Leader(name1,age1)
{ strcpy(Dept,dept);
cout<<"constructor of Emplpoyee"<<endl;
}
//派生类要重新析构
~Emplpoyee(){
cout<<"deconstructor of Emplpoyee"<<endl;
}
};
int main(){
Emplpoyee emp("zhang",40,"人事处","limuzi",36);
return 0;
}
2、运行时的多态
#include<iostream>
#include<string.h>
using namespace std;
class pet{
public:
virtual void speak(){cout<<"zzzz"<<endl;};
};
class cat:public pet{
public:
void speak(){cout<<"miao~miao~"<<endl;};
};
class dog:public pet{
public:
void speak(){cout<<"wang!wang!"<<endl;};
};
int main(){
pet pet1,*p=&pet1;
cat cat1;
dog dog1;
int x;
cin>>x;
if(x==1){
p=&cat1;
}
if(x==2){
p=&dog1;
}
p->speak();
return 0;
}
3、派生类对象替换基类对象
替换原则:基类对象可以用公有派生类对象取代
替换形式:
1、赋值
pet pet1;
cat cat1;
pet1=cat1;
2、派生类对象初始化基类对象的引用
pet &pet2=cat1
3、将派生类的地址传递给基类指针
pet *p;
cat cat1;
p=&cat1;
问题是:尽管派生类对象赋值给了基类对象(指针或引用),
但基类对象不调用派生类同名成员函数
那么如何才能让基类对象(指针或引用)调用派生类同名成员函数呢?
4、虚函数
什么是虚函数?在函数定义头部加上virtual
用途:通过指向派生类的基类指针,访问派生类中的同名覆盖成员函数
#include<iostream>
#include<string.h>
using namespace std;
class pet{
public:
virtual void speak(){cout<<"how does a pet speak?"<<endl;};
};
class cat:public pet{
public:
virtual void speak(){cout<<"miao~miao~"<<endl;};
};
class dog:public pet{
public:
virtual void speak(){cout<<"wang!wang!"<<endl;};
};
int main(){
pet pet1,*p1,*p2;
cat cat1;
dog dog1;//how does a pet speak?
pet1.speak();
pet1=cat1;//how does a pet speak?
pet1.speak();
pet1=dog1;//how does a pet speak?
pet1.speak();
p1=&cat1;//miao~miao~
p1->speak();
p2=&dog1;//wang!wang!
p2->speak();
p2=new cat;//miao~miao~
p2->speak();
pet &pet2=dog1;//wang!wang!
pet2.speak();
return 0;
}
注意:!!!
应使用指针或引用调用虚函数,而不要以对象名调用虚函数
pet1=cat1;
pet1.speak();//不要这种
//正确的如下
pet*p1=&cat1;
p1->speak();
//或者
pet &pet2=dog1;//
pet2.speak();