2017-05-24 7 views
25

(파생되지 않음)과 final 키워드 설명하면서 저자는이 예제를 제공합니다가 더 기본 클래스가없는 클래스의 가상 함수에 마지막 키워드를 추가하는 것은 의미가 있습니까 나는 멋진 <a href="https://isocpp.org/wiki/faq/cpp11-language-classes#final" rel="noreferrer">awesome C++11 tutorial</a>을 읽고있다

struct B { 
    virtual void f() const final; // do not override 
    virtual void g(); 
}; 
struct D : B { 
    void f() const;  // error: D::f attempts to override final B::f 
    void g();  // OK 
}; 

final 키워드를 사용하면 여기에 의미가 있습니까? 제 의견으로는 여기서 가상 키워드를 사용하지 말고 f()이 무시되는 것을 막을 수 있습니다.

+2

전문가가 따라 와서 정말로 모호한 컴파일 오류를 해결할 수있는 유스 케이스를 제시 할 수 있기 때문에 나는 두드리는 것을 원하지 않습니다 ...하지만 어리석은 일입니다. – StoryTeller

+2

[가상 클래스와 최종 클래스로 기본 클래스 함수를 표시하는 데 의미가 있습니까?] (https://stackoverflow.com/questions/16739135/is-there-any-sense-in-marking-a-base) -class-function-as-both-virtual-and-final) –

+0

실제로 더 많은 중복이 있습니다. [최종 가상 기능의 요점은 무엇입니까?] (https://stackoverflow.com/questions/11704406/) – Ruslan

답변

32

virtualfinal으로 기능을 표시하지 않으면 하위 클래스는 계속 함수를 구현하고 기본 클래스 기능을 숨길 수 있습니다. 아이 클래스는 또는이 기능을 숨길 무시할 수 없습니다 기능을 virtualfinal을 만들어

.

+2

나는 전문가가 올 줄 알았어. 나는 이것이 숨어있는 것을 막기 위해 오버 헤드의 방식으로 너무 많이 생각한다고 생각하지만 (생략 될 수도 안될 수도 있음). +1. – StoryTeller

+2

분명히이 문제에 대한 합의가 있지만, 나는 아무 것도 유용하지 않고 * 다른 언어 기능을 깨는 것이 이익으로 간주되는 방법에 대한 설명을 원합니다. – Quentin

+1

@Quentin은 모호성 가능성을 제거합니다. template 의 경우 void doStuff (DerivedFromB & b) {b.f(); }', 당신은 100 % 확신 할 수 있습니다.'f()'call이 어디로 가는가 – Caleth

2

당신의 직감이 맞습니다. virtual을 즉시 사용하여 final으로 캡슐화하면 가상이 아닌 기능보다 이점이 없습니다. 이 기능을 보여주기위한 간단한 샘플 코드입니다.

또한 다른 답변에서 설명한 것처럼 실제로는이 기능은 숨겨집니다. D 또는 그 파생 클래스에 동일한 매개 변수 목록이있는 f 함수를 사용할 수 없습니다.
모델에 f의 뚜껑을 달기로 결정할 때 트레이드 오프가됩니다. 실제 가상 전화를 수행 할 수있는 방법이 없으므로 본질적으로 단점이 있으며 이점이 없습니다.

+1

이름을 숨기는 것을 생각했습니다. 따라서 파생 클래스가 f()를 숨길 수 없습니다. 가상 키워드없이 f()를 선언하면 파생 클래스에서 숨길 수 있습니다. –

+0

댓글은 언제나처럼 downvotes로 높이 평가됩니다. – Quentin

+1

나는 downvotes가 이름을 숨기는 것을 무능하게하는 것에 대한 당신의 태도 때문에 있다고 생각한다. 나는이 기능을 실제로 어떤 특별한 목적으로 사용할 수 있다고 생각하지만, 내 머리 꼭대기에서 그런 목적을 지칭 할 수는 없다. – Ruslan

11

예! 예제에서 제공하는 final 키워드는 올바르게 파생 클래스가 f()을 무시하지 못하게합니다. 무시 또는 숨어 컴파일 오류가 발생에서 f()virtualfinal 기능, 어떤 시도를함으로써

struct B { 
    void f() const; // do not override 
    virtual void g(); 
}; 
struct D : B { 
    void f() const; // OK! 
    void g();  // OK 
}; 

: 함수가 가상이 아닌 경우, D:f()숨기기 함수의 기본 클래스 버전으로 허용됩니다.