родительский класс не возвращает значение дочернему классу

#c

#c

Вопрос:

Я только изучаю c . Известно, что дочерний элемент недоступен для родительского, дочерний имеет доступность. Но здесь почему c1.showval показывает, что значение b равно 0, хотя оно уже установлено 10 в B классе.

 class A{
    int a;
    public:
        int b;  
};

class B:public A{
    public:
        int setVal(int x){
            b = x;
        }
        void prntVal(){
            cout << "The value is " << b;
        }
};

class C:public B{
    public:
    void showVal(){
        cout << "The value is " << b;
    }
};

int main(){
    B b1;
    C c1;
    b1.setVal(10);
    c1.showVal();
}
 

Комментарии:

1. Вы устанавливаете значение для b1 , но печатаете его для c1 . Обратите внимание, что это c1 значение неинициализируется при его печати.

2. setVal объявлено, что возвращает an int , но это не так, поэтому ваша программа имеет неопределенное поведение .

3. b1 и c1 это разные экземпляры

4. Даже два B экземпляра не будут совместно static использовать переменные, не являющиеся членами.

Ответ №1:

Хотя C он является производным от B , они не разделяют свои члены. Вы устанавливаете значение b 10 для b1 , но c1 b оно остается неинициализированным.

Ответ №2:

b1 и c1 — это разные объекты. b1 является экземпляром (объектом) класса B, а c1 — другим экземпляром (объектом) класса C. Следовательно, b1.b и c1.b являются разными переменными и, следовательно, b1.setVal(10) задает значение только b1.b, а не c1.b . Если вы хотите, чтобы экземпляры (объекты) имели одинаковое значение для A::b, вы можете сделать его статическим.

 class A{
  int a;
public:
  static int b;  
};

int A::b;