2009-11-12 3 views
2

Animal 클래스에서 상속받은 Dog 클래스가 있다고 가정 해 보겠습니다. Dog : operator =에 Animal :: operator =에 대한 호출을 삽입 할 수 있습니다.C++에서 mother-class 연산자를 호출하는 일반적인 방법은 무엇입니까?

가장 읽기 쉽고 일반적인 방법은 무엇입니까?

난 당신이 완전히 당신의 부모 구현을 참조하는 방법을 규정,

static_cast<Animal*>(this)->operator=(other); 

this->Animal::operator=(other); 
+2

두 번째 경우에는 'this->'가 불필요합니다. 'Animal :: operator = (other);'충분하다. –

+2

또한 첫 번째 경우는 "* static_cast (this) = other;"로 더 자연스러워 보일 수 있습니다. –

답변

12

당신은 자식 클래스 메소드

Animal::operator=(other); 

this-> 필요 없음 내에서 그 일을하고 있기 때문에. 범위 분석 구문은 요청 된 것과 정확히 일치합니다. 나는 그것을 "간접적으로"던지는데 한 점을 보지 못했다.

캐스팅으로 수행하면 메서드 호출의 동적 해상도가 비활성화되지 않으므로 일반적으로 예상되는 결과가 생성되지 않을 수 있습니다. (그리고 BTW, 할당 연산자는 가상으로 선언 할 수 있습니다.) 명백한 결과는 가상 메소드를 사용하면 "캐스트"변형이 끝없는 재귀를 쉽게 생성 할 수 있다는 것입니다.

+2

실제로 파생 클래스에서 오버라이드하는 경우 가상 *해야합니다. 거의 확실하게 원하지 않는 동작을 얻을 수 있습니다. – moswald

+0

@mos : 일반적으로 누군가가 "대입 연산자"에 대해 이야기하고있을 때, 대입 연산자를 의미합니다. 복사 할당 연산자는 클래스의 서명이 다른 (다른 매개 변수 유형) 다른 계층 구조에서 서로를 재정의하지 않습니다. 따라서 귀하의 추론은 복사 할당 연산자에는 적용되지 않습니다. 할당 연산자는 자체 규칙이있는 특수 멤버 함수이기 때문에 할당 연산자에 적용되지 않을 수 있습니다. – AnT

+0

@mos : ... 그러나 일반적으로 할당 연산자가있는 경우에도 위험이 있습니다. – AnT

6

this->Animal::operator=(other); 올바른 방법입니다 ... 난 그 두 안다고 생각, 당신은 필요가 없습니다 이를 위해 자신을 던지면 코드를 읽기가 더 어려워집니다.

+0

Alexandrescu도 다음을 사용합니다 :'Animal & me = * this; 나 = 기타; 나는 이것의 정확한 목적을 이해하고 있는지 확신 할 수 없다. 그러나 그것은 깨끗하고 (내가 말할 수있는 한) 같은 효과를 낸다. –

+1

@AndreyT가 말했듯이 운영자 = 가상이 될 위험이 있습니다. 원하는 방법을 호출하지 않은 것 외에는 끝없는 재귀에서 끝낼 수 있습니다. –

+1

...이 "Alexandrescu"변형은 가상 할당 연산자의 경우에도 무한 재귀를 유도 할 수 있다는 점을 제외하고는. 예, 사실상 동등성 연산자는 정확히 (실제로는) 보이는 것이 아니라 일반적인 방법 (할당 연산자가 아닌 경우)으로 심각하게 파손되는 것을 알고 있습니다. – AnT

관련 문제