Как реализация g++ справляется с этой ситуацией?

Это продолжение-вопроса к этому .

Рассмотрим этот пример.:

#include 

class A
{
};

class B : public A
{
    public:
    int i;
    virtual void Func() = 0;
};

class C : public B
{
    public:
    char c;
    void Func() {}
};

int main()
{
    C* pC = new C;
    A* pA = (A*)pC;
    std::cout << "pC == " << std::hex << pC << "\n";
    std::cout << "pA == " << std::hex << pA << "\n";
    return 0;
}

В Visual Studio 2010 вывод (на моей машине):

pC == 002DEF90
pA == 002DEF94

(объясняется принятым ответом на вопрос ).

С g++ вывод будет:

pC == 0x96c8008
pA == 0x96c8008

Итак, вопрос в том, как реализация g++ обрабатывает этот случай? Что делает адреса одинаковыми, когда Cдолжен иметь виртуальную таблицу? (Я знаю, что это деталь реализации, не говорите, что :)я интересуюсь этой деталью реализации из любопытства).

6
задан Community 23 May 2017 в 12:01
поделиться