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

Inherited member function accessing data members

本文关键字:成员 函数 继承 数据成员 访问      更新时间:2023-10-16

考虑以下示例代码:

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

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

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();    
}

分类为AA::display()无法访问B私有成员