2013-07-24 4 views
5

메서드의 가상 속성을 상속하는 것에 대해 혼란스러워합니다.가상 함수 상속

클래스 A, 클래스 B, 클래스 C 및 클래스 D가 있다고 가정 해 보겠습니다. 클래스는 다음과 같이 상속됩니다. A -> B -> C -> D, A는 기본 클래스입니다.

이번에는 확실합니다. 기본 클래스 (클래스 A)에서 가상 클래스 메서드 선언을 시작하면 기본 클래스에서 파생 된 모든 클래스에 대해 메소드 가상이 생성됩니다. 파생 클래스. (가상으로 결정된 B 및 C 클래스 메소드).

혼란이 여기에 있습니다. 기본 클래스 A에 가상 멤버가 없을 경우 어떻게됩니까? 대신 클래스 B가 가상 메소드를 선언한다고 가정 해 보겠습니다. 이 변경은 상속 체인 (C 및 D 클래스)에 속한 모든 파생 클래스에 대해 함수를 가상으로 만듭니다. 그래서 논리적으로 C와 D의 B는 일종의 "기본 클래스"입니다. 맞습니까? 아니면 내가 틀렸어?

답변

13

맞네요.

나는이 경우 가장 좋은 방법은 시도이라고 생각 :

#include <iostream> 

using namespace std; 

class A { 
    public: 
     void print(){ cout << "print A" << endl; }; 
}; 

class B: public A { 
    public: 
     virtual void print(){ cout << "print B" << endl; }; 
}; 

class C: public B { 
    public: 
     void print(){ cout << "print C" << endl; }; 
}; 

int main() 
{ 
    A *a = new C(); 
    B *b = new C(); 

    a->print(); // will print 'print A' 
    b->print(); // will print 'print C' 

    return 1; 
} 
5

전적으로 맞습니다. 아이는 그 조상들의 상속 재산을 상속받습니다. 기본 클래스는 하위 함수 (예 : 새 함수 또는 변수)를 상속받을 수 없습니다. 가상 함수는 자식 클래스가 가상 함수의 구현을 변경하여 기본 가상 함수가 호출되지 않으면 자식 클래스가 재정의 할 수있는 함수입니다.

A는 B, C, D의 기본 클래스입니다. B는 C, D의 기본 클래스이고 C는 D의 기본 클래스이기도합니다.

+0

빠른 제안 : 기본 클래스는 가상 메서드가있는 경우,해야 내가 함께 파생 된 클래스에 속하는 가상 메소드의 나머지 부분을 강조 키워드 가상? 그냥 표현력을 높이 려구요. –

+0

필요하지 않습니다. 기본 클래스에서 한 번 수행하면 모든 하위 클래스에서 함수 구현 (모든 상속)을 변경할 수 있습니다. – theta

+0

@RobertEagle 파생 클래스에서'virtual' 또는'override'를 추가하는 것은 필요하지 않습니다 *,하지만 _yes_라고 할 수 있습니다. 가능하면 함수의 시멘틱스를 시각적으로 알려주는 것이 좋습니다. *'g ++'와 같은 컴파일러를 사용하지 않는 한 이러한 한정자가 누락되면 경고를 제공하고 경고는 오류로 간주합니다. –

0

물론 할 수 있습니다. 가상 메서드는 재정의 할 때 선택 사항이므로 클래스 A 또는 B에서 선언 할 필요가 없습니다. 클래스 A에서 해당 메서드를 사용하고 싶지 않으면 클래스 B에 선언하면됩니다.