オーバーロード演算子の制限により、派生オブジェクトを基底クラスのオブジェクトにコピーすることはできません=
。では、なぜ派生オブジェクトのアドレスを基底クラスのポインタにコピーできるのでしょうか? 派生オブジェクトは基本クラスのオブジェクトよりもサイズが大きいため、逆である必要はありません。実際、試してみると、というエラーが表示されました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;
}
注: 私が示したエラーは、コンパイラが実際に表示したものを簡略化したものです。