2012-04-20 6 views
1

다형 함수를 선언 할 때는 가상 클래스 함수를 선언해야한다는 것을 알고 있습니다.상속 클래스의 C++ 가상 함수

class Base 
{ 
public: 
    virtual void f(); 
}; 

내 질문 당신이 그것을 "봉인"하는 것처럼 아동의 동작 것으로 예상 될지라도, 가상으로 상속 클래스의 함수를 선언해야한다?

class Child : public Base 
{ 
public: 
    void f(); 
}; 
+0

' 나는 자식이 상속 될 수 있고 f()가 차례로 재정의 된 가상이 필요하다는 것을 안다. 그것은 단지 명백한 잘못이다. 그는 기본 클래스의 함수가 가상이므로 모든 상속 함수는 가상으로 함축되어 있습니다. 따라서 '가상'을 다시 사용할 필요가 없습니다. 절대로. – Jasper

답변

7

아니요, 가상 함수를 다시 선언 할 필요가 없습니다.

기본 클래스에서 virtual 기능이 자동으로 가상 모든 재정의 함수를 선언합니다 :

struct A 
{ 
    void foo();   //not virtual 
}; 
struct B : A 
{ 
    virtual void foo(); //virtual 
} 
struct C : B 
{ 
    void foo();   //virtual 
} 
+1

C가 B를 상속 받도록 예제를 다시 편집하십시오. –

+0

@Kevin 고맙습니다. 또한 A.의 B –

0

선언 F()를 아동 가상으로는 아동의 정의를 읽는 몇 가지 일을하는 데 도움이됩니다. 문서로 유용합니다.

0

기본 클래스 덮어 쓰기가 virtual으로 표시되면 다른 모든 재정의는 암시 적으로 그렇게됩니다. 기능을 virtual으로 표시 할 필요는 없지만 문서화를 위해이 기능을 사용하는 경향이 있습니다.

마지막 부분 : 자녀가 마치 "봉인 된"것처럼 행동한다고해도?

template <typename T> 
class seal { 
    seal() {} 
    friend T; 
}; 
: 당신이 클래스에 원하는 경우
는, 당신은 클래스 그래서 같은 실을 작성하여 (이 C++ 03 일반적으로 완전히 구현 가능한 아니었다) C++ 11에서 그것을 실제로 수

그리고는 (CRTP) 그것에서 봉인 클래스를 상속 :

class Child : public Base, virtual seal<Child> { 
// ... 
}; 

트릭 때문에 가상 상속의 사용의 계층 구조에서 가장 파생 형이 경우하는 int (가상 기본 생성자를 호출해야한다는 것입니다 seal<Child>), 그 생성자는 p 템플리트 클래스에서 rivate하고 선언을 통해 Child에만 사용할 수 있습니다.

당신은 밀봉, 또는 그 밖에 완벽한 씰을 제공하지 않은 일반적인 접근 방식을 사용하고 싶었 모든 클래스의 seal 유형을 생성하거나 것 C++에서

(가 무단으로 변경 될 수 있습니다)