继承成员函数访问数据成员

发布于 2024-12-25 08:43:02 字数 966 浏览 1 评论 0原文

考虑下面的示例代码:

#include <iostream>

using namespace std;

class A
{
    private:
        static int a;
        int b;

    protected:

    public:

        A() : b(0) {}

        void modify()
        {
            a++;
            b++;
        }

        void display()
        {
            cout << a <<"\n";
            cout << b <<"\n";
        }

};

int A::a=0;

class B : public A {

    private:
        int b;

    public:
        B(): b(5)
        {
        }

};

int main()
{
    A ob1;
    B ob2;
    ob1.display();
    ob2.display();

    return 0;

}

在上面的代码中,class A 有一个私有数据成员 bclass B 也有一个私有数据成员b。函数display()用于显示数据成员。 当我使用ob1.display()调用display()时,display()访问A类的私有数据成员b。我明白这一点。但是,当我使用 ob2.display 调用显示时,display() 会访问哪个 b ?是A类的b还是B类的b?请解释为什么它访问类A的b类B的b

Consider the sample code below:

#include <iostream>

using namespace std;

class A
{
    private:
        static int a;
        int b;

    protected:

    public:

        A() : b(0) {}

        void modify()
        {
            a++;
            b++;
        }

        void display()
        {
            cout << a <<"\n";
            cout << b <<"\n";
        }

};

int A::a=0;

class B : public A {

    private:
        int b;

    public:
        B(): b(5)
        {
        }

};

int main()
{
    A ob1;
    B ob2;
    ob1.display();
    ob2.display();

    return 0;

}

In the code above, the class A has a private data member band class B also has a private data member b. The function display() is used to display the data members.
When i invoke display() using ob1.display(), display() accesses the private data member b of class A. I understand that. But when i invoke display using ob2.display, which b does display() access? Is it the b of class A or b of class B? Kindly explain the why it accesses class A's b or class B's b

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

太阳男子 2025-01-01 08:43:02

它将访问A::bA 类中的 display 方法实现根本不知道 B::b 的存在,更不用说使用它了。出于所有意图和目的,B::bA::b 是分开的。仅在 B 本身范围内,名称冲突使 b 引用 B::b,隐藏 A::b< /代码>。成员变量不能是虚拟

It will access A::b. The display method implementation in class A has no clue about the existence of B::b at all, let alone using it. For all intents and purposes, B::b is separate from A::b. Only in the scope of B itself, the name conflict makes b refer to B::b, hiding A::b. Member variables cannot be virtual.

伤感在游骋 2025-01-01 08:43:02

ob2.display() 将访问派生类成员。
成员函数调用始终在 this 上求值,this->display() 如果 this 指向基类的对象,并且因此,display() 函数内对 b 的任何引用都会被评估为 this->b,即 b基类的。

这是因为基类的 display() 不知道是否有任何其他类派生自它。基类始终独立于派生类。为了解决问题,遵循的通用模式是在派生类中提供一个 display() 方法,然后该方法依次调用基类的 dsiplay() 方法。

void B::display()
{
    //cout << a <<"\n";
    cout << b <<"\n";
    A::display();    
}

ob2.display() will access the derived class member.
The member function call is always evaluated on this, this->display() the this in case points to object of your Base class and hence any reference to b inside the display() function is evaluated as this->b which is b of the Base class.

This is because display() of the Base class has no knowledge of whether any other class derives from it. Base class is always independent of the Derived class. To solve a problem the uual pattern followed is to provide a display() method in the Derived class which then in turn calls the dsiplay() method of the Base class.

void B::display()
{
    //cout << a <<"\n";
    cout << b <<"\n";
    A::display();    
}
谁人与我共长歌 2025-01-01 08:43:02

它是A 类。 A::display() 无法访问 B 私有成员。

It is class A. A::display() cannot access B private members.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文