#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
объявлено, что возвращает anint
, но это не так, поэтому ваша программа имеет неопределенное поведение .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;