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

ответ

3

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

+0

С благодарностью: Так что же использовать 'class B', наследующий' class A's' 'display()' функцию. 'class B' унаследовал функцию' display() 'от' класса A', и поэтому я ожидал 'display()' для доступа к классу B ' –

+1

@LinuxPenseur. Существует много применений. Это просто не один из них. Чтобы достичь того, чего вы хотите, вы можете либо не вводить новую переменную, а инициализировать базовый класс 'b' через вызов базового конструктора или вводить« виртуальный »метод в базовом классе, который возвращает значение' b' в базовом классе и переопределить его, чтобы вернуть значение 'b' в производном классе. –

+1

Или просто иметь метод в производном классе, который обращается к членам производного класса и далее инициирует вызов путем вызова метода базового класса, который обращается к членам базового класса. –

0

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

+0

Как это релевантно? Или мне интересно, если я что-то пропустил. –

+0

Ответила на эту часть вопроса - «Но когда я вызываю отображение с использованием ob2.display, которое b показывает() доступ?» – Mahesh

2

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

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

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

Обратите внимание, что функция отображения находится в классе A, если вы ее пропустили. Не могли бы вы перефразировать свой ответ на основе этого. Я говорю это, потому что ob2.display, похоже, не имеет доступа к члену производного класса. –

+0

@ LinuxPenseur: Я сделал. –

+0

Теперь у меня есть сомнения :). почему указатель 'this' в случае' ob2.display() 'указывает на объект класса Base? ob2 - объект производного класса. –

 Смежные вопросы

  • Нет связанных вопросов^_^