O mesmo nome de classe em diferentes arquivos C ++

Se dois arquivos C ++ tiverem diferentes definições de classes com o mesmo nome, quando forem compilados e vinculados, algo será descartado mesmo sem um aviso. Por exemplo,

// a.cc
class Student {
public:
    std::string foo() { return "A"; }
};
void foo_a()
{
    Student stu;
    std::cout << stu.foo() << std::endl;
}

// b.cc
class Student {
public:
    std::string foo() { return "B"; }
};
void foo_b()
{
    Student stu;
    std::cout << stu.foo() << std::endl;
}

Quando compilado e vinculado usando g + +, ambos produzirão "A" (se a.cc preceder b.cc na ordem da linha de comando).

Um tópico similar éAqui. Eu vejo que o namespace resolverá esse problema, mas não sei por que o linker nem sequer dispara um aviso. E se uma definição da classe tiver uma função extra que não esteja definida em outra, diga se b.cc é atualizado como:

// b.cc
class Student {
public:
    std::string foo() { return "B"; }
    std::string bar() { return "K"; }
};
void foo_b()
{
    Student stu;
    std::cout << stu.foo() << stu.bar() << std::endl;
}

Então o stu.bar () funciona bem. Obrigado a qualquer um que possa me dizer como o compilador e o linker funcionam em tal situação.

Como uma questão extra, se as classes são definidas em arquivos de cabeçalho, elas devem sempre ser agrupadas com namespace sem nome para evitar tal situação? Existe algum efeito colateral?

questionAnswers(5)

yourAnswerToTheQuestion