1

考虑下面的示例代码:

#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()用于显示数据成员。当我使用 调用 display()时, display() 访问类 Aob1.display()的私有数据成员。我明白这一点。b但是当我调用 display usingob2.display时,bdisplay() 访问哪个?是bA级的还是bB级的?请解释为什么它访问class A's bclass B's b

4

3 回答 3

3

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.

于 2012-01-05T02:50:44.403 回答
2

ob2.display()将访问派生类成员。
成员函数调用始终在 上进行评估,thisin case 指向您的 Base 类的对象,因此对函数内部的任何引用都被评估为Base类的引用。 this->display()thisbdisplay()this->bb

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

void B::display()
{
    //cout << a <<"\n";
    cout << b <<"\n";
    A::display();    
}
于 2012-01-05T02:53:11.110 回答
0

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

于 2012-01-05T02:51:38.537 回答