C++의 많은 이상한 코너 중 하나가 발생했습니다. 이 경우 C++에서는 서로 다른 클래스에서 상속 된 두 개의 가상 함수가 동일한 이름 및 형식 시그니처를 갖고 있더라도 동일한 함수가 아니라고 간주합니다.
C++이 이런 식으로 행동하는 데는 몇 가지 좋은 이유가 있습니다. 예를 들어, 두 함수가 실제로 같은 이름과 형식 시그니처가 있음에도 불구하고 실제로 같지 않은 경우가 종종 있습니다. 두 기능의 의미 적 의미는 다릅니다.여기
은 예입니다
namespace vendor1 {
class Circle {
public:
virtual ::std::size_t size() const { return sizeof(*this); }
};
} // namespace vendor1
namespace vendor2 {
class Shape {
public:
virtual double size() const = 0;
};
class Circle : public Shape {
public:
virtual double size() const { return radius_ * radius_ * M_PI; }
};
} // namespace vendor2
그리고 당신이 시도 :
namespace my_namespace {
class Circle : public ::vendor1::Circle, public ::vendor2::Circle {
// Oops, there is no good definition for size
};
그래서이에 의지해야한다 :
namespace my_namespace {
class Vendor1Circle : public ::vendor1::Circle {
public:
virtual ::std::size_t data_structure_size() const { return size(); }
};
class Vendor2Circle : public ::vendor2::Circle {
public:
virtual double area() const { return size(); }
};
class Circle : public Vendor1Circle, public Vendor2Circle {
// Now size is still ambiguous and should stay that way
// And in my opinion the compiler should issue a warning if you try
// to redefine it
};
그래서를 C++ 좋은 이유가있다 동일한 형식 시그니처 (반환 유형이 유형 시그니처의 일부가 아님)로 가상 함수를 처리하고 두 가지 차이점의 이름 다른 기능으로 기본 기지.
까지 using
까지 ... 모두 using
지시어는 "이 네임 스페이스에서이 네임 스페이스의 이름을 여기에 선언 된 것처럼 추가합니다."라고 말합니다. 가상 함수에 관한 한 이것은 null 개념입니다. 이름을 사용할 때 모호성이 다른 방식으로 해결되어야한다고 제안합니다. 단지 이름을 선언 할뿐 이름을 정의하지는 않습니다. 가상 함수를 재정의하려면 새 정의가 필요합니다.
OTOH, 당신은 다음과 같이 인라인 간단한 썽크 재정에 넣으면 : 좋은 컴파일러는 그것을보고도 함수를 만드는 귀찮게하지 알고, 대신 가상 테이블 항목이 바이올린한다
class Bar : public Foo, public Goo {
public:
virtual DerivedElem& get_elem() { return Goo::get_elem(); }
};
옳은 일을하는 것. 그것은 실제로 코드를 방출하고 주소를 촬영할 경우에 사용할 수있는 기호가해야 할 수도 있습니다,하지만 여전히 단순히 Foo *
통해 호출 할 때 함수가 완전히 사라질 필요로 가상 테이블을 바이올린 할 수 있어야한다.
깔끔하고 작지만 독립적 인 예입니다. 코드 질문을 가진 모든 사람들이 당신이 한 일을 해줬 으면 좋겠어요. – Omnifarious
공변 반환 형식에 대해 Foo에서 파생되지 않아야합니까? – Chubsdad
안녕 얘들 아, 신속하고 도움이 답변을 주셔서 감사합니다. 다형성 할당 Steve에 관한 좋은 팁. 경우에는 누군가가 내 실제 코드 '끈적 거리는'에서, 이러한 구조에서 찾고 이유를 궁금하면 다음 템플릿 클래스에 의해 상속와 '푸'는 다양한 클래스를 액세스하기위한 '인터페이스'입니다 템플릿 클래스입니다. – Tom