c++ syntax 변수 재 정의....

korone.net의 이미지

#include <stdio.h>
 
struct A
{
    int aaa;
    int bbb;
 
    A()
    {
        aaa = 1;
        bbb = 2;
    }
 
    void print() { printf("A aaa:%d bbb:%d\n", aaa, bbb); }
};
 
struct B : public A
{
    short aaa;
 
    B() : A()
    {
        aaa = 3;
    }
 
    void print() { printf("B A::aaa:%d aaa:%d bbb:%d\n", A::aaa, aaa, bbb); }
};
 
 
int main(int argc, char** argv)
{
    B bbb;
    printf("B aaa:%d\n", bbb.aaa);
 
    bbb.print();
 
    return 0;
}

편의상 struct로 했습니다.
A라는 객체에 int a;를 선언하고
B라는 객체는 A를 상속받은후에 다시 short a;로 선언했습니다.
이게 가능한지 오늘 처음 알았습니다.

이게 가능하도록 하면 많은 혼란이 일어날텐데. 왜 이런것을 가능케 해놓은것인지요?
혹시 아시는 분 있으신가요?

혹시나 gcc만 그런걸까 해서 msc로도 컴파일 해봤는데도 마찬가지네요.
member function()은 같은 형으로 선언해도 문제없다는것을 잘 알 고 있었지만 이렇게는 한번도 써 본적이 없어서 그런지 너무나 당황스럽습니다.
무슨 설계 철학이 있는건가요?