关于类的继承的概念问题
以下是一个简单的人管理程序:(以下类中的函数都是些输入和输出函数,对问题没有什么影响,由于篇幅过大,
所以将其全部省略!只是将其的所有数据成员列了出来)
class Date{ //这是一个日期类;其中存放的是日期!
protected:
static const int dys[];
long int ndays;
public:
//......
};
class Money{ //这是一个存入工资的类;
double value;
public:
//.....
};
class SSN{ //存放SSN的类;
long int ssn;
public:
//......
};
class Person{ //定义人员基本信息类;
public:
enum Sex{unknown,male,female};
enum MaritalStatus{single,married,divorced,widowed};
protected:
string name;
string address;
string phone;
SSN ssn;
Date dob;
Sex sex;
Maritalstatus mstatus;
public:
//......
};
class Employee:public Person{ //雇员类型类,公有继承了person类;
protected:
Date datehired;
public:
//......
};
class wagedEmployee:public Employee{ //这是一个雇用人员的工资类,公有继承了Employee类;
Money hourlywage;
public:
//......
};
string ReadString(string& prompt) //输入一个字符串并返回其地址;
{
//......
}
Date ReadDate(string& prompt) //输入一个日期并将其反回;
{
//......
}
Money ReadMoney(string& prompt) //输入一个工资数据并将其返回;
{
//......
}
void PersonInput(Person* pPerson) //调用以上三个输入函数实始化pPerson所指向类的数据成员
{
//......
}
void WagedEmployeeInput(WagedEmployee* pWagedEmployee) //也是调用以上三个输入函数初始化数据成员;
{
//......
}
int main()
{
Person* pPerson=0;
pPerson=new WagedEmployee;
PersonInput(pPerson);
WagedEmployeeInput((WagedEmployee*)pPerson);
pPerson->FormattedDisplay(cout); //这是以上类的一个格式输出成员函数;
delete pPerson;
return 0;
}
(以上程序是书上的例子,没有逻辑的错误!)
我有以下几点不明白:
1、看例子的意图是想用pPerson指针指向一个WagedEmployee类对象,为什么他要用Person* pPerson=0;
呢?难道WagedEmployeeInput* pPerson=0;不是更直观吗?用pPerson指向一个WagedEmployee对象为什么不
会报错误呢?
2、我的理解是一个类派生自另一个类时,他就拥有父类所有成员,他们就应该是一体,但以上为什么不放在一起
初始化呢?难道他们不是一个整体?
3、如果他们不是一个整体,那他们是怎么关联的呢?在内存里又是怎么样分配实间的呢?
请各位大虾指点!
小弟先谢谢了!
[解决办法]
1.动多态的关键就是基类指针指向多种派生类啊,
2.基类属于派生类的一部分:派生类构造的时候要先构造基类,调用基类的构造函数,
重内向外构造嘛,
[解决办法]
1.为什么他要用Person* pPerson=0;
================================
既然是书上的例子,应该是为了讲清某一个知识点吧...FormattedDisplay是不是个虚函数?楼主说的那种方式自然是正确的.
至于这种方式应该是用来演示多态吧(猜测而已,呵呵)...
指针之中存储的不过是一个对象的地址而已.如果是把一个WagedEmployee对象赋给一个Person对象,会有对象"切割"的问题,
不过多数编译器也只是warning而已,指针的话,就没有这种限制了...
2.你的理解是对的.至于你的问题,没看全程序不敢乱说,呵呵.应该是WagedEmployeeInput单独用来为子类部分的成员赋值吧...;
另外,不是初始化,是赋值...
3.内存分配的话是由编译器决定的...未必说父类部分成员和子类部分成员就是严格分开的...
[解决办法]
1. 基类指针可以指向派生类对象。也就是向上转型。如3楼所说,楼主的直接用派生类指针也没有问题。用基类指针,是为了多态,抽象;而由基类部分完成共同的操作。如果代码中再加一个派生自Person类的类,就可以感受出来了。
2. 子类拥有父类的所有数据,这是对的。不明白楼主的“一体”是什么概念,在构造中,会自动先进行父类(对象、数据)的构造,然后执行子类的构造函数;析构则正好相反。
好像在另一个帖子中,已经有人回答了。这些知识是C++多态、抽象的基础,多看看教材,可以慢慢理解。至于第三个问题,我个人觉得不用深究,学C++,就应该是为了面向对象设计吧,关注太多内部实现细节没什么好处。
------解决方案--------------------
1、看例子的意图是想用pPerson指针指向一个WagedEmployee类对象,为什么他要用Person* pPerson=0;
呢?难道WagedEmployeeInput* pPerson=0;不是更直观吗?用pPerson指向一个WagedEmployee对象为什么不
会报错误呢?
=====================================================
楼主 需要看看关于 多态 相关的知识。
很多时候,无法确定对象是 WagedEmployeeInput 还是 Person,
如果使用 WagedEmployeeInput 可能出现错误,
而使用 Person,则可以保证运行正常
问题 2 3, 推荐楼主看看 inside C++ object model 一书
[解决办法]
class wagedEmployee:public Employee{ //这是一个雇用人员的工资类,公有继承了Employee类;
lz 怎麽想的工資類從 Employee繼承?
工資可以單獨設計類,但是工資應該是 Employee 的一個字段。
要組合爾不是繼承。