//继承的方式:public private protected
/*
1.私有成员不能被继承
2.公有继承保持不变
3.私有继承变为私有
4.保护继承变为保护
创建一个子类对象时,先调用父类的构造函数再调子类的构造函数
销毁一个对象时,先调用子类的析构函数再调父类的析构
子类对象和父类对象的转换:子类可转换成父类,但是父类不能转换成子类
多重继承:一个类有多个基类
多重继承中的二意性(虚继承)
//动态绑定和静态绑定是相对于函数而言
静态绑定:在编译阶段确定调用函数的绑定称为静态绑定
//在对象中,普通成员函数是不占内存的,而成员变量是占内存的
动态绑定:在运行时确定调用函数的绑定称为动态绑定
虚函数:函数声明时,在前面加virtual
虚函数是占内存的,
//我们发现同一个类型的指针(或者引用),调用相同函数表现不一样:多态
//多态:相同的自定义的数据类型的指针(或引用)有不同的形态
//多态应用:用父类指针变量保存子类对象的地址,
再用父类指针变量调用虚函数
//覆盖(重写)
*/
/*
class cParent
{
public:
cParent(){
cout << "cParent::cParent()" << endl;
}
cParent(int a,int b){
cout << "cParent::cParent(int a)" << endl;
}
~cParent(){}
};
class cChild :public cParent
{
public:
cChild(){}
cChild(int a):cParent(a,10){}
~cChild(){}
};*/
//工作人的类
class cWorker
{
public:
cWorker(){}
~cWorker(){}
virtual void Work(){
cout << "工作" << endl;
}
void TestFun(){
cout << "cWorker::TestFun()" << endl;
}
int m_age;
};
//程序员
class cProgrammer:public cWorker
{
public:
cProgrammer(){}
~cProgrammer(){}
void Work(){
cout << "写代码" << endl;
}
void TestFun(){
cout << "cProgrammer::TestFun()" << endl;
}
};
//人事专员
class cPersonal :public cWorker
{
public:
cPersonal(){
}
~cPersonal(){}
void Work()
{
//this->a = 10;
cout << "招聘" << endl;
}
void TestFun(){
cout << "cPersonal::TestFun()" << endl;
}
int a;
};
//作业 :
/*
作业:实现动物类 鸟类 狗类 蛇类,每个类里实现一个行走方法Walk(),
如果是鸟类输出:我飞着走,狗类:我四只脚走 蛇类:我是用溜的。
分别创建三种动物的对象保存在同一个数组中,再遍历数组让他们走起来
*/
int _tmain(int argc, _TCHAR* argv[])
{
cPersonal* per = new cPersonal;
per->m_age =100;
cWorker* pWorker = per;
cout << "pWorker->m_age: "<< pWorker->m_age << endl;
cProgrammer* programmer = new cProgrammer;
// A:输出错误的值 B:输出100
per->Work();
pWorker->Work();
cWorker* pWorker2 = programmer;
pWorker2->Work();
pWorker2->TestFun();
programmer->TestFun();
/*int a;
cPersonal* pWorker = NULL;
pWorker->Work();*/
//A.出错 B.正常运行
return 0;
}