由于重载运算符=
的限制,我们无法将派生对象复制到基类的对象中。那么,为什么我们可以将派生对象的地址复制到基类的指针中?不应该是另一种方式,因为派生对象的大小比基类对象大。事实上,当我尝试它时,我得到一个错误,表示the conversion of a base object to the derived object is not allowed
。你能告诉我为什么吗?我无法在互联网上找到任何相关信息。
代码如下: -
#include<string>
#include<vector>
#include<iostream>
using namespace std;
class employee
{
protected:
string name;
double pay;
public:
employee(string ename,double payRate)
{
name = ename;
pay = payRate;
}
virtual double GrossPay(int days)
{
return pay*days;
}
virtual string getName()
{
return name;
}
};
class manager:public employee
{
private:
bool salaried;
public:
manager(string ename,double payRate,bool isSalaried):employee(ename,payRate)
{
salaried = isSalaried;
}
virtual double GrossPay(int days)
{
if(salaried)
return pay;
else
return pay*days;
}
};
int main(void)
{
employee* emp2;
employee emp3("Bill",350);
manager mgr3("Alice",200,true);
emp2 = &emp3;
cout<<emp2->getName()<<" earns "<<emp2->GrossPay(40)<<endl;
emp2 = &mgr3;
cout<<emp2->getName()<<" earns "<<emp2->GrossPay(40)<<endl; // The code works till here
//The problematic part starts from here:-
manager* mgr6;
employee emp5("NewBill",300);
mgr6 = &emp5;
cout<<mgr6->getName()<<" earns "<<mgr6->GrossPay(40)<<endl;
return 0;
}
注意:我展示的错误是编译器实际显示的简化。
答案 0 :(得分:1)
由于没有足够的信息,您无法将基础对象转换为派生对象。这就像有一个空的三明治,假装它是BLT!
向下转换对象的问题是派生类可能更大,因此不适合可用内存,但指针是允许的,因为派生类完全是基类的更多。继续三明治的比喻:如果你忽略了填充,BLT只是一个空的三明治。
在您的示例中,mgr6
认为它指向manager
,但是说bool salaried
有一个名为IsSalaried()
的getter,如果您调用{{1}时会发生什么}}。这显然不合逻辑,因此不允许。
答案 1 :(得分:1)
继承关系通常被描述为“是A”,例如,如果你有一个基类车辆和两个派生类MotorCycle和Semi那么
Motorcycle *m = new Motorcycle();
Semi *s = new Semi();
Vehicle *v1 = m;
Vehicle *v2 = s;
很好。摩托车是车辆,半是车辆。 你可以在v1和v2上调用你想要的任何方法,并且会有一个该方法的实现。
另一方面,如果你说:
Motorcycle m2 = v2;
你会遇到麻烦。车辆不一定是摩托车。
假设Motorcycle类有一个名为wheelie()的方法不在Vehicle类中(出于显而易见的原因)在该任务之后你可以说: M2-&GT;车轮离地();
你的穷人半身不知道怎么做。因此,从基类到派生类的强制转换是不合法的。
答案 2 :(得分:1)
manager* mgr6;
employee emp5("NewBill",300);
mgr6 = &emp5;
在您的示例中,manager
类派生自employee
类。因此,emp5
是一个基类对象。它不了解派生类成员。
mgr6
的类型为manager *
,并且它试图指向emp5
。如前所述,emp5
没有派生类子对象,可以使赋值操作起作用。
然而,这有效。
employee* emp2;
manager mgr3("Alice",200,true);
emp2 = &mgr3;
因为,mgr3
同时包含派生子类和基类子对象。
编辑:在最后一行修正了emp3到mgr3