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

时间:2012-01-05 02:46:46

标签: c++ inheritance member-functions datamember

请考虑以下示例代码:

#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有一个私有数据成员b,而class B也有一个私有数据成员b。函数display()用于显示数据成员。 当我使用ob1.display()调用display()时,display()访问A类的私有数据成员b。我理解这一点。但是当我使用ob2.display调用显示时,b显示()访问?它是A类的b还是B类的b?请解释它访问class A's bclass B's b

的原因

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

ob2.display()将访问派生类成员 成员函数调用始终在thisthis->display() this上进行评估,以防指向Base类的对象,因此b内的display()引用} function被评估为this->b,它是Base类的b

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

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

答案 2 :(得分:0)

是班级AA::display()无法访问B私人会员。