Ta sama nazwa klasy w różnych plikach C ++

Jeśli dwa pliki C ++ mają różne definicje klas o tej samej nazwie, to kiedy są kompilowane i łączone, coś jest wyrzucane nawet bez ostrzeżenia. Na przykład,

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

Po skompilowaniu i połączeniu ze sobą za pomocą g ++, oba będą wyświetlały „A” (jeśli a.cc poprzedza b.cc w kolejności wiersza poleceń).

Podobny temat totutaj. Widzę, że przestrzeń nazw rozwiąże ten problem, ale nie wiem, dlaczego linker nie wystrzelił nawet ostrzeżenia. A jeśli jedna definicja klasy ma dodatkową funkcję, która nie jest zdefiniowana w innej, powiedz, czy b.cc jest aktualizowany jako:

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

Następnie stu.bar () działa dobrze. Dziękujemy każdemu, kto może mi powiedzieć, jak działa kompilator i linker w takiej sytuacji.

Jako dodatkowe pytanie, jeśli klasy są zdefiniowane w plikach nagłówkowych, czy powinny być zawsze zawijane bezimienną przestrzenią nazw, aby uniknąć takiej sytuacji? Czy są jakieś skutki uboczne?

questionAnswers(5)

yourAnswerToTheQuestion