访问派生类中的基类成员

Posted

技术标签:

【中文标题】访问派生类中的基类成员【英文标题】:Accessing a base class member in derived class 【发布时间】:2011-03-01 11:11:52 【问题描述】:

我有一个简单的类如下

class A 
protected:
    int x;
;
        
class B : public A 
public:
    int y;

    void sety(int d) 
        y = d;
    

    int gety() 
        return y;
    
;
    
int main() 
    B obj;
    obj.sety(10);
    cout << obj.gety();
    getch();

如何在不创建class A 的实例的情况下从派生的class B 的实例设置protected 实例变量A::x 的值。

编辑:我们可以使用 B 的对象访问A::x 的值吗?喜欢obj.x

【问题讨论】:

访问它。它在 B 的成员函数中可见。 【参考方案1】:

B 是一个 A,因此创建B 的实例就是创建A 的实例。话虽这么说,我不确定你的实际问题是什么,所以这里有一些希望能澄清事情的代码:

class A

protected:
    int x;
;

class B : public A

public:
    int y;

    int gety() const  return y; 
    void sety(int d)  y = d; 

    int getx() const  return x; 
    void setx(int d)  x = d; 
;

int main()

    B obj;

    // compiles cleanly because B::sety/gety are public
    obj.sety(10);
    std::cout << obj.gety() << '\n';

    // compiles cleanly because B::setx/getx are public, even though
    // they touch A::x which is protected
    obj.setx(42);
    std::cout << obj.getx() << '\n';

    // compiles cleanly because B::y is public
    obj.y = 20;
    std::cout << obj.y << '\n';

    // compilation errors because A::x is protected
    obj.x = 84;
    std::cout << obj.x << '\n';

obj 可以像A 的实例一样访问A::x,因为obj 隐含地是A 的实例。

【讨论】:

可能想提及范围以及它如何影响访问。【参考方案2】:

A::x 受到保护,因此无法从外部访问,无论是 A().x 还是 B().x。然而,它可以在A 和直接继承它的方法中访问(因为受保护,而不是私有),例如B。因此,无论语义如何,B::sety() 都可以访问它(作为普通的 xA::x,以防被 B::x 遮蔽或纯粹冗长)。

【讨论】:

【参考方案3】:

请注意,B 没有对 A::x 的完全访问权限。它只能通过 B 的实例访问该成员,而不是 A 类型的任何内容或从 A 派生的任何内容。

您可以使用一种解决方法:

class A

  protected:
   int x;
   static int& getX( A& a )
   
      return a.x;
   

   static int getX( A const& a )
   
     return a.x;
   
;

现在使用 getX,从 A 派生的类(如 B)可以访问任何 A 类的 x 成员。

您还知道,友谊不是传递或继承的。通过提供访问功能,可以针对这些情况做出相同的“解决方法”。

在您的情况下,您实际上可以通过您的 B 提供对 x 的“公共”访问权限,方法是使用公共功能来访问它。当然,在实际编程中,它受到保护是有原因的,你不想让所有东西都完全访问,但你可以。

【讨论】:

完全正确,但对于初学者,您应该将此与private:的行为进行对比【参考方案4】:

您可以在 B 类中将其简称为 x

例如:

class B : public A

public:
    ...

    void setx(int d)
    
        x=d;
    
;

【讨论】:

以上是关于访问派生类中的基类成员的主要内容,如果未能解决你的问题,请参考以下文章

可以通过[重复]在派生类中初始化受保护的基类成员

派生类中隐藏的基类模板成员函数,尽管参数列表不同

访问派生类中的受保护成员

为啥我可以通过指向派生对象的基类指针访问派生私有成员函数?

protectedpublicprivate

无法从派生类构造函数参数访问受保护的基类成员[重复]