Mismo nombre de clase en diferentes archivos C ++

Si dos archivos C ++ tienen definiciones diferentes de clases con el mismo nombre, entonces, cuando se compilan y vinculan, algo se desecha incluso sin una advertencia. Por ejemplo,

// 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;
}

Cuando se compilan y se enlazan utilizando g ++, ambos mostrarán "A" (si a.cc precede a b.cc en el orden de la línea de comandos).

Un tema similar esaquí. Veo que el espacio de nombres solucionará este problema, pero no sé por qué el enlazador ni siquiera dispara una advertencia. Y si una definición de la clase tiene una función adicional que no está definida en otra, diga si b.cc se actualiza 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;
}

Entonces stu.bar () funciona bien. Gracias a cualquiera que pueda decirme cómo funcionan el compilador y el enlazador en tal situación.

Como una pregunta adicional, si las clases se definen en los archivos de encabezado, ¿deberían estar siempre envueltas con un espacio de nombres sin nombre para evitar tal situación? Hay algún efecto secundario?

Respuestas a la pregunta(5)

Su respuesta a la pregunta