2017-05-18 2 views
-2

나는 C++을 사용하고있다. 사용부모 연산자에 전화 << C++

ostream & operator<<(std::ostream & os, const Worker & obj) 
{ 
    return os << "First Name: " << obj.GetFirstName() << ", Last Name: " << obj.GetLastName() << " ,ID: " << obj.GetID() << ", WorkPlace: " << obj._workPlace << endl; 
} 

:

나는 다음과 같은 < <을 opeator 무시하기 위해 노력하고있어 (H 파일) :

friend ostream& operator<<(std::ostream& os, const Worker& obj); 

CPP

Person *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 

cout << w2; 

그러나 운영자 < < 호출되지 않습니다.

무엇이 실수입니까?

감사합니다.

+2

당신은'cout << * w2;'를 원한다. – songyuanyao

+0

당신은'Person' 대신'Person *'을 제공합니다. –

+1

포인터와'new'를 피하십시오. –

답변

0

: 당신은,588를 재정 의하여 다형성을 사용하려고(부모 작업자에게 전화하기 < <) 그러나 이것은 오버라이드가 아니라 오버로드이므로 Person 포인터가 실제로 Worker 개체를 가리키는 경우에도 friend ostream& operator<<(std::ostream& os, const Worker& obj)Person에 대해 호출되지 않습니다.

다형성 솔루션은 기본 클래스에 대해 operator<<을 오버로드하여 파생 클래스에서 재정의 할 수있는 가상 함수를 호출합니다.

struct Base 
{ 
    virtual std::string toString() { return "Base"; } 
} 

struct Derived: Base 
{ 
    virtual std::string toString() { return "Derived"; } 
} 

ostream & operator<<(std::ostream & os, const Base & obj) 
{ 
    return os << obj.toString() << endl; 
} 
1

w2Person 개체에 대한 포인터이고 operator<<에는 const 참조가 필요합니다. 당신은 Person* 소요 다른 << 운영자를 작성하거나

cout << *w2; 
0

를 사용하지만 operator<<가 호출되지 않습니다 수 있습니다.

무엇이 실수입니까?

포인터 (예 : 주소)를 전달했기 때문에 결과물에 출력 할 수 있습니다. 당신이 실제 객체가 Worker 있는지 확인하는 경우가 WorkerPerson에서 다시 캐스팅 수

Worker *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 
cout << *w2; 

나 : 당신이 Worker에 대한 operator<<을 가지고 있기 때문에

, 당신은 이런 식으로 할 필요가

더 큰 문제를 숨겨 여러분 std::cout << w2; 대신 std::cout << *w2; 오류
Person *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 
cout << *(Worker*)w2; 
0

이것은 무시하지 않습니다. 가상 멤버 함수를 무시합니다. 이것은 이 오버플로이고 호출 할 함수는 런타임에 객체의 유형이 아니라 컴파일시 변수 유형에서 결정됩니다. 그는 Person& 아닌 Worker&을 이후

그래서, 심지어 작동하지 않습니다 *w2를 사용하여, Person에서 해당 Worker 상속을 가정.

기본 클래스에 가상 출력 함수를 추가하고이를 재정의하고 상위 연산자를이 함수 만 호출하는 것으로 바꿉니다.

class Person 
{ 
    public: 
    // ... 
     virtual void write(std::ostream& os); 
    }; 

std::ostream& operator<<(std::ostream& os, const Person& p) 
{ 
    p.write(os); 
    return os; 
} 

class Worker : public Person 
{ 
    public: 
    // ... 
     void write(std::ostream& os) override; 
}; 

기본 클래스가 아닌 다른 연산자는 필요하지 않습니다.

관련 문제