0

これが明らかな場合は申し訳ありませんが、私は周りを検索しましたが、この問題の解決方法についてはまだ不明です. これが私のコードです:

#include <iostream>
#include <string>
using namespace std;

class PermMagnet {
public:
    string name;
    int ac_rating;
    int dc_rating;
    int mass_kg;
    int age;
    PermMagnet(){
        // default constructor
        name = "";
        ac_rating = 0; dc_rating = 0;
        mass_kg = 0; age = 0;
    }
    PermMagnet(string c_name, int c_ac_rating, int c_dc_rating, int c_mass_kg, int c_age){
        // parameterised constructor
        name = c_name;
        ac_rating = c_ac_rating;
        dc_rating = c_dc_rating;
        mass_kg = c_mass_kg;
        age = c_age;
    }
    string get_owner(){
        return owner;
    }
    string get_classifier(){
        return classifier;
    }
    int get_coil_count(){
        return coil_num;
    }
protected:
    string location = "facility hall";
private:
    string owner = "Unspecified Staff";
    string classifier = "MAG-DP-";
    const int coil_num = 2;
};

class ElecMagnet : public PermMagnet {
public:
    // inherit base class constructors
    using PermMagnet::PermMagnet;

    string get_location(){
        return location;
    }

private:
    string owner = "Specified Staff";
    string classifier = "MAG-QD-";
    const int coil_num = 4;
};

int main() {

    // Create object using default constructor
    PermMagnet perm1;
    cout << "'perm1' age: " << perm1.age << endl;

    // Create object using parameterised constructor
    PermMagnet perm2("PermMagnet 2", 380, 400, 1500, 35);
    cout << "'perm2' age: " << perm2.age << " | 'perm2' name: " << perm2.name << endl;
    cout << "Owner of 'perm2': " << perm2.get_owner() << endl;
    cout << "Upper current bound of 'perm2': " << perm2.get_current_limit("upper") << "A" << endl;
    cout << "Number of coils in 'perm2': " << perm2.get_coil_count() << endl << endl;

    // Create a ElecMagnet (derived class) object
    ElecMagnet elec1("ElecMagnet 1", 170, 200, 850, 27);
    cout << elec1.get_classifier() << endl;
    cout << elec1.get_coil_count() << endl;

    return 0;
}

このコードの出力は次のとおりです。

'perm1' age: 0
'perm2' age: 35 | 'perm2' name: PermMaget 2
Owner of 'perm2': Unspecified Staff
Upper current bound of 'perm2': 780A
Number of coils in 'perm2': 2

MAG-DP-
2

Process finished with exit code 0

ご覧のとおり、"owner"、"classifier"、"coil_num" を、ユーザーが変更できないプライベート メンバーにする必要があります。これらは、問題のクラスによっても異なります。

問題:

問題は、出力の最後の 2 行です。派生クラス (ElecMagnet) がこれらのメンバーを返すパブリック関数を継承すると、基本クラスのメンバーが返されます。自分のものではありません。これは、PermMagnet クラスの「classifier」と「coil_num」を返すため、わかります。

派生クラスがこのように動作する理由を誰かが知っていますか? ベースではなく、独自のプライベートメンバーにアクセスするべきではありませんか?

4

3 に答える 3

0

プライベート メンバーは、同じクラスまたはフレンドのメンバー関数によってのみアクセスできます。thisC++ は、変数の検索が現在のポインター( )に応じて動的に実行される Python などのようには動作しませんself

于 2020-12-23T15:07:23.767 に答える