【发布时间】:2013-08-11 18:27:26
【问题描述】:
由于重载运算符=的限制,我们不能将派生对象复制到基类的对象中。那么,为什么我们可以将派生对象的地址复制到基类的指针中呢?不应该反过来,因为派生对象的大小比基类对象大。事实上,当我尝试它时,我得到了一个错误,上面写着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;
}
注意:我显示的错误是编译器实际显示的简化。
【问题讨论】:
-
我不确定我是否理解正确。你可以做 -
Base obj = Derived();。但是,对象被切片。请发布您尝试过的测试程序。 -
你问为什么不能分配
Derived* obj = (Base*)whatever?它与大小无关,因为指针的大小都相同。它必须这样做,您不能保证 (Base*) 指向派生对象,它可以是任何其他派生类。 -
@MadScienceDreams “指针大小都一样” 实际上,这不能保证是真的。标准不需要这个。 (例如分段内存模型的远近指针)
-
@milleniumbug 哇...+1 你每天都学到新东西...有时我很高兴我学会了编程,因为它变得更简单了,有时我认为它只是让我成为一个相对草率的程序员.
标签: c++ inheritance