2010-12-13 2 views
-1

임 다음특정 항목을 출력하기 위해 가상으로 있어야하는 기능은 무엇입니까? 출력하려고

apple 
banana 
orange 
banana 

내가 출력하기 위해 제 기능을 가상 수 있도록해야합니까?

class Red 
{ 
public: 
    void PrintMe() { Foo(); Bar(); } 
    void Foo() { printf("pear\n"); } 
    void Bar() { printf("lemon\n"); } 
}; 

class Green : public Red 
{ 
public: 
    void PrintMe() { Bar(); Foo(); } 
    void Foo() { printf("apple\n"); } 
    void Bar() { printf("banana\n"); } 
}; 

class Blue : public Green 
{ 
public: 
    void Foo() { printf("orange\n"); } 
    void Bar() { printf("grape\n"); } 
}; 
int main(int argc, char* argv[]) 
{ 
    Green g; 
    Blue b; 

    Red *pR1 = &g; 
    Red *pR2 = &b; 
    pR1->PrintMe(); 
    pR2->PrintMe(); 
} 
+0

이 아픈 질문을 닫기로 투표했습니다. 대답 할 수있는 문제가 너무 많습니다. –

+1

-1의 투표 결과를 닫거나 그에 동의하지 않겠습니다. 이 질문에는 두 가지 정답이 있습니다 (예 및 기타 문제 또는 아니오). 생각할 거리. –

+0

$ 20 OP는 어떤 대답도 선택하지 않으며 질문을 결코 의미있게 수정하지 않는다고 말합니다. –

답변

0

예, 그렇지 않으면 두 개의 빨간색을 인쇄하고 있습니다.

0

Red::Foo()Red::Bar()은 가상해야합니다. 당신이 빨간색라는 이름의 클래스를 정의하지만,

어쨌든 레드 라는 이름의 클래스 다음 녹색 상속 빨간색은 기본 클래스와 경우 :

+0

'Green :: PrintMe'은'Red :: PrintMe'과 비교하여'Foo'와'Bar'를 역순으로 호출합니다. –

+0

미안하지만, 그 것을 알지 못했습니다. –

+0

@larsmans 네, 틀림없이 "사과 바나나"를 인쇄하려고합니다. 즉, "Red :: PrintMe()"와 Green :: PrintMe()'는 빨간 청어입니다. –

0

는 코드 몇 가지 문제가있는 것 같습니다 다른 클래스가 메서드를 재정의하려면 가상을 실제로 선언해야합니다.

0

짧은 대답 : PrintMe()는 가상이어야합니다.

는 설명 :

당신이 기본 클래스 포인터가 가리키는 전문 객체의 메소드를 호출 할 때문에

, 당신은 그 방법은 가상 확인해야합니다.

// Base class pointer pointing to specialized class 
Red *pR1 = new Green(); 

// If PrintMe() is not virtual, this call will be Red::PrintMe(). 
// If you want to call Green::PrintMe, make it virtual. 
pR1->PrintMe(); 
0

LOL! 아무도이 권리를 얻지 못했습니다!

foo/bar의 순서가 바뀔 수 있기 때문에 PrintMe를 가상으로 만들어야합니다.

다른 것들을하기 때문에 Foo와 Bar를 가상으로 만들어야합니다.

다형성 고등학생을 구현하고 있기 때문에 DESTRUCTOR 가상을 만들어야합니다. 이 코드는 코드에 전혀 포함되어 있지 않습니다. 귀하의 특정 시험 main()에는 필요하지 않지만 가장 합리적이며 사소한 용도로 사용됩니다.

편집 : 확인, 아마도 나도 잘못 알고 있습니다. PrintMe가 기본 포인터를 통해 사용될 때 실제로 동작을 무시하지 못하게하려면 가상이 아니어야합니다. 귀하의 코드는 다소 혼란 스럽습니다. 아무도 그렇게하지 않을 것입니다.

2

때문에, 당신은 당신의 현재 설정과 출력으로 "사과 바나나, 오렌지, 바나나"를 얻을 수있는 방법은 없습니다 :

  1. Red *pR1를 사용하여 "사과 바나나"를 인쇄하려면 FooBar 가상해야한다.
  2. 함수를 가상으로 선언하면 모든 파생 클래스에서 그대로 유지됩니다.
  3. Bar은 가상이므로 pR2->PrintMe()은 "오렌지 포도"를 인쇄합니다. "바나나"를 인쇄 할 방법이 없습니다.
+0

OP는 파란색으로 Bar const를 선언 할 수 있습니다. 그렇다면 오버라이드가 아닙니다. –

+1

@ 노아 로버츠 : OP의 질문은 "일부 기능 가상"에 관한 것이기 때문에 "현재 설정으로는"가능하지 않다고 말했다. – casablanca

+0

음, 현재 설정에 가상 기능이 없기 때문에 이동합니다.) –

관련 문제