2012-03-31 2 views
1

가상 기능 및 런타임 호출의 기본 개념을 알고 있습니다.누군가 가상 기능에 대해이 동작을 설명 할 수 있습니까?

A& A::operator=(char) //expected output 
    A& A::operator=(const A&) //Why this Output? in case of *ap2 = b2; 

b2B 형식의 개체이지만 여전히 가상 A& operator=(const A&)에 간다 -이 :하지만이 프로그램을 실행 나에게

class A { 
    public: 
    A& operator=(char) { 
     cout << "A& A::operator=(char)" << endl; 
     return *this; 
    } 
    virtual A& operator=(const A&) { 
     cout << "A& A::operator=(const A&)" << endl; 
     return *this; 
    } 
    }; 

    class B : public A { 
    public: 
     B& operator=(char) { 
     cout << "B& B::operator=(char)" << endl; 
     return *this; 
     } 

     virtual B& operator=(const B&) { 
     cout << "B& B::operator=(const B&)" << endl; 
     return *this; 
     } 
    }; 

    int main() { 
    B b1; 
    B b2; 
    A* ap1 = &b1; 
    A* ap2 = &b1; 
    *ap1 = 'z'; 
    *ap2 = b2; 
    } 

을 혼동 코드의 일부 조각을 실행 시도 나에게 다음과 같은 출력을 제공 이 아닌 입니다. 이게 왜 그렇게?

답변

3

virtual B& operator=(const B&)virtual A& operator=(const A&)을 덮어 쓰지 않으므로; 논쟁은 다르다.

+0

Chalesworth의 유효한 형태입니다 함수 호출 및하지의 종류 중 포인터 유형 문제 객체는 가리키는 포인터입니다. 가상 함수의 경우 실제로 발생합니다. 왜냐하면 여기서 ap2는 A의 포인터 유형이지만 B 유형의 객체를 가리키고 있기 때문에? 나는 어딘가 잘못인가? – Invictus

+1

@Ritesh :'* ap2 = b2' 라인에서,'* ap2'의 컴파일 타임 타입은'A'입니다. 따라서 컴파일러는 'A'가 나타내는 인터페이스에있는 (가상) 멤버 함수 만 고려할 수 있습니다. –

2

파생 클래스 함수가 ​​기본 클래스 함수를 재정의하려면 파생 클래스 함수가 ​​완전히 동일한 함수 프로토 타입 (예외 : 공변 반환 유형이 허용됨)이 있어야합니다.

파생 클래스 여기 B= 연산자는 기본 클래스 A=와 같은 함수 프로토 타입을 가지고 있지 않으며, 따라서 그것은 기본 클래스 =를 대체하지 않습니다.

사용할 수있는 연산자는 =뿐입니다.

2

함수를 재정의 (override)로 간주하려면 서명이 기본 클래스의 버전과 정확하게 일치해야합니다. 포인터 또는 참조가 반환되면 반환 유형이 공변일 수 있습니다. 즉,

B& B::operator= (A const&) 

을 정의하여 기본 클래스의 버전을 재정의해야합니다. 재정의 함수에서 입력 매개 변수의 경우 기본 클래스 만 사용하여 컨텍스트에서 기본 클래스 버전이 파생 개체와 함께 호출되도록 보장 할 수 없으므로이 변수는 공변 적이 지 않습니다. 대체 함수의 매개 변수가 반 변형이 될 수 있지만 C++은이를 지원하지 않습니다.

2

여기 파생 된 클래스에서 함수는 B를 취하는 반면 기본 클래스에서는 A를 사용합니다. 따라서 기본적으로 함수 인수가 오버라이드되지 않습니다.

또한 파생 당신이베이스와 B의 기준에의 참조를 반환하는 귀하의 경우와 같이 최우선의 경우 반환 형식이 다를 수 있습니다. 가상 자료 & FUNC (CONST 자료 &) 가상 파생 & FUNC (CONST 자료 &) 이 그렇게 그 것이다 최우선

관련 문제