Например, в этом фрагменте кода, если line [a]
закомментирован, вывод равен 0.
inh2.cpp
#include<iostream>
using namespace std;
class A {
public:
int x;
A() { x = 10; }
};
class B : public A {
public:
int x; // <--------- [a]
B() { x = 0; }
};
int main() {
A* ab = new B;
cout << ab->x << endl;
}
Результаты gcc
$ g++ inh2.cpp
$ ./a.out
10
$
У меня есть два вопроса:
- Как
ab->x
разрешает 10
в приведенном вышедело?Объект имеет тип class B
и, следовательно, должен иметь значение 0
. - Почему комментирование
Line [a]
меняет поведение кода?Я считаю, что x
в любом случае был бы унаследован, что должно привести к тому же поведению.
Мои рассуждения для Q # 1 выше:
ab
указывает на область памяти объекта class B
.Это физический объект в том смысле, что всем переменным с их значениями назначается память.
Переменная x
в этом объекте хранит значение 0
.
Когда ab->x
сделано, ab сообщает нам местоположение объекта в памяти, и мы идем внутрь него, чтобы найти, что x равно 0. Поэтому мы должны вывести 0.
Где я здесь не так?