2016-12-02 1 views
-1

파생 클래스에서 가상 함수의 이름을 지정하는 방법을 결정하려고합니다.파생 클래스 명명의 가상 함수

Base.h 
class Base 
{ 
public: 
    virtual void Virtual() = 0; 
}; 

Derived.h 
class Derived : public Base { 
public: 
    void Virtual(); 
}; 

Derived.cpp 
Derived::Virtual() // or Base::Virtual 
{ 
    cout << "Derived Virtual.\n"; 
} 

구현 파일에 Derived :: Virtual 또는 Base :: Virtual을 사용하고 어떤 방법으로 문제가 발생합니까?

+1

왜 '파생 된'함수를 정의 할 때'Base ::'가 필요하다고 생각하십니까? – NathanOliver

답변

1

달성하려는 목표에 따라 다릅니다.

Derived::Virtual은 오버라이드 된 함수를 정의하고 Base::Virtual은 기본 클래스 함수를 정의합니다. 둘 다 할 수 있습니다. 이전의 정의를 건너 뛸 수 없습니다. 즉, Derived::Virtual은 순수 가상이 아니므로 정의하지 않은 경우 호출되면 연결 오류가됩니다.

그것은 의미가 몇 가지 일반적인 동작을 제공하는 Base::Virtual을 정의 할 수 있도록 다음과 같이 완전히 자격하여 가상 파견을 사용하지 않고 그 함수를 호출 않습니다

void Derived::Virtual() { 
    Base::Virtual(); 
    std::cout << Derived::Virtual() < "\n"; 
} 

는 참조 용으로 C++ pure virtual function have bodyDoes it make any sense to define "pure" virtual functions in the base class itself?를 참조하십시오.

+2

프로그래머가 쉽게 호출을 잊어 버릴 수 있고 컴파일러가 알아 채지 못해 이상한 런타임 버그가 발생하기 때문에 이는 꽤 안티 패턴입니다. 좀 더 나은 접근법은 공용 비가 상 ** 함수를 갖는 것입니다.이 함수는 공통적 인 동작을 가지며 ** 비공개 순수 가상 ** 함수를 호출하여 파생 클래스에 구현됩니다. –

+0

@ChristianHackl 맞습니다. 템플릿 방법입니다. 실제로이 방법을 보지 않았습니다. 완전히 정규화하여 순수 가상 함수를 호출하는 공통 관용구를 인용 한 것입니다. 이 C++ 기능의 실제 사용 사례는 무엇입니까? – iksemyonov

관련 문제