我无法访问我的基类的受保护成员

Posted

技术标签:

【中文标题】我无法访问我的基类的受保护成员【英文标题】:I can't access to the protected member of my base class 【发布时间】:2022-01-06 07:20:28 【问题描述】:

我是使用 c++ 编程的新手,并且在创建构造函数和对象时遇到了一些麻烦。 如何访问我的受保护成员,例如 Fahrzeug 类中的 int p_iID? 我必须分别为我的两个对象访问它们。

如果你能帮我解决这个问题,我会很高兴。

class Fahrzeug 
private:
    
protected:
    string p_sName;
    int p_iID;
    double p_dMaxGeschwindigkeit;
    double p_dGesamtStrecke;
    double p_dGesamtZeit;
    double p_dZeit;
public:
    virtual void vAusgeben(Fahrzeug* pFahrzeug1,Fahrzeug* pFahrzeug2);
    virtual void vKopf();
    virtual void vSimulieren(Fahrzeug *pFahrzeug, Fahrzeug *pFahrzeug2);
class PKW;

class PKW: public Fahrzeug
PKW(const int p_iMaxID, string p_sName, double p_dMaxGeschwindigkeit, double p_dGesamtStrecke) 
    p_iID = p_iMaxID;
    this->p_sName = p_sName;
    this->p_dMaxGeschwindigkeit = (p_dMaxGeschwindigkeit < 0) ? 0 : p_dMaxGeschwindigkeit;
    this->p_dGesamtStrecke = p_dGesamtStrecke;

    void vAusgeben(PKW pkw1, PKW pkw2) 
    cout << "\n";
    PKW pkw1;
    PKW pkw2;
    pkw1.vKopf();

    cout << setw(5) << left << pkw1.p_iID<< " " << setw(10) <<pkw1.p_sName << setw(8) << " "    << setw(15) << showpoint << pkw1.p_dMaxGeschwindigkeit << setw(3) << " " << pkw1.p_dGesamtStrecke; //Here I have the issue with pkw1.p_sName
    cout << "\n";
    cout << setw(5) << left << pkw2.p_iID << " " << setw(10) << pkw2.p_sName << setw(8) << " " << setw(15) << showpoint << pkw2.p_dMaxGeschwindigkeit << setw(3) << " " << pkw2.p_dGesamtStrecke;
    cout << "\n";



【问题讨论】:

您收到的实际错误信息是什么?另外,为什么vAusgeven 会创建两个与其参数名称完全相同的新变量,从而隐藏它们? 另外,您可能应该为Fahrzeug 创建一个PKW 可以委托给它的构造函数。 另外,p_ 前缀在语法高亮和“转到定义”的世界中真的没用。 Ewww,两种匈牙利方言层层叠叠。痛……痛…… 为了最小化repro,您只能使用一个成员变量和一个函数... 【参考方案1】:
void vAusgeben(PKW pkw1, PKW pkw2) 

您可能不想按值传递PKW 对象(或期望object slicing)。改为传递 const 引用:

void vAusgeben(const PKW& pkw1, const PKW& pkw2) 

另外,为什么你shadowing 你的 2 个参数带有这些局部变量?

PKW pkw1; // ???
PKW pkw2; // ???

【讨论】:

【参考方案2】:

除了 cmets(和另一个答案)中提出的问题外,对于受保护的成员还有一条特殊规则,有时会让人们感到惊讶。派生类型的对象可以访问其基子对象的受保护成员,但不能访问其他对象的受保护成员。所以:

struct B 
protected:
    int i;
;

struct D : B 
    void f(const B&);
;

void D::f(const B& b) 
    i = 3;   // okay, accessing my own protected member
    b.i = 3; // no, access to protected member of different object not allowed

在问题的代码中,函数PKW::vAusgeben可以访问自己的p_sNamep_dMaxGeschwindigkeitp_dGesamtStrecke的副本,但不能访问pkw1.p_sNamepkw1.p_dMaxGeschwindigkeit或@ 987654328@.

【讨论】:

以上是关于我无法访问我的基类的受保护成员的主要内容,如果未能解决你的问题,请参考以下文章

protectedpublicprivate

访问基类的受保护成员

派生类无法访问基类的受保护方法

静态成员函数无法访问类的受保护成员

C++ - 访问基类的受保护/私有成员

无法访问基类中的受保护成员 [重复]