0

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

注: 私が示したエラーは、コンパイラが実際に表示したものを簡略化したものです。

4

3 に答える 3

1

十分な情報がないため、基本オブジェクトを派生オブジェクトに変換できません。空のサンドイッチを持って、BLT のふりをするようなものです!

オブジェクトをダウンキャストする際の問題は、派生クラスが大きくなり、使用可能なメモリに収まらない可能性があることですが、派生クラスは正確に基本クラスに近いため、ポインターは許可されます。サンドイッチの比喩を続けます。フィリングを無視すると、BLT は単なる空のサンドイッチになります。

あなたの例mgr6では、 を指していると思いますが、 を呼び出すとどうなるかmanagerというゲッターがあったとします。これは明らかに論理的ではないため、許可されません。bool salariedIsSalaried()mgr6->IsSalaried()

于 2013-08-09T18:28:05.147 に答える