Унаследованная функция-член для доступа к данным-членам - PullRequest
1 голос
/ 05 января 2012

Рассмотрим приведенный ниже пример кода:

#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() используется для отображения членов данных.Когда я вызываю display () с помощью ob1.display(), display () получает доступ к закрытому элементу данных b класса A. Я понимаю это.Но когда я вызываю display, используя ob2.display, какой b доступ к display ()?Это b класса А или b класса В?Пожалуйста, объясните, почему он обращается к class A's b или class B's b

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Он получит доступ A::b.Реализация метода display в классе A не имеет никакого представления о существовании B::b, не говоря уже об его использовании.Для всех намерений и целей B::b является отдельным от A::b.Только в самой области B конфликт имен делает b ссылкой на B::b, скрывая A::b.Переменные-члены не могут быть virtual.

2 голосов
/ 05 января 2012

ob2.display() получит доступ к производному члену класса.
Вызов функции-члена всегда оценивается на this, this->display() на this в случае, если указатель на объект вашего базового класса и, следовательно, любая ссылка на b внутри функции display() оценивается как this->b, что b Базового класса.

Это потому, что display() Базового класса не знает, является ли какой-либо другой класс производным от него. Базовый класс всегда не зависит от производного класса. Чтобы решить проблему, следует использовать шаблон display() в классе Derived, который затем вызывает метод dsiplay() базового класса.

void B::display()
{
    //cout << a <<"\n";
    cout << b <<"\n";
    A::display();    
}
0 голосов
/ 05 января 2012

Это класс A.A::display() не может получить доступ к частным пользователям B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...