2016-07-14 3 views
0

의 내가 base라는 좋은 보는 기본 클래스가 있다고 가정 해 봅시다 : 나는 클래스가 나는 base에서 상속 싶습니다 foo라는 이름의 한 지금C++ : 재정의 메서드 클래스와 같은 이름을 가진

class base 
{ 
public: 
    virtual void foo() const = 0; 
}; 

을 및 base::foo를 오버라이드 (override) : 당신은 클래스와 같은 일이 (C는 탐욕하지 않는 클래스와 동일한 이름을 가진 방법이 있습니다 생성자를 믿고 ++ 방법 이름을 허용하지 않는 한

class foo : public base 
{ 
public: 
    virtual void foo() const override; 
}; 

이, C++에서 불법입니다 알 반환 유형을 갖기 위해 낮추었다). 이 클래스 나 메소드의 이름을 변경하는 것을 포함하지 않는 방법이 있습니까? 외부 사용자가 foo 클래스를 만들 수 있도록하려면 다른 사람이 호출하는 base::foo 메서드가 있다는 것을 알지 못합니다 (foo은 명사와 동사가 될 수 있습니다).

답변

0

좋아, 여기 내 (약간 악) 솔루션 ... 사실이 작동하지 않을 수 있기 때문에,foo 조금 재미 호출

// Create an intermediate class which actually implements the foo method: 
class foo_intermediate : public base 
{ 
public: 
    virtual void foo() const override; 
}; 

// Derive from that class and forward the constructor along 
class foo : public foo_intermediate 
{ 
public: 
    using foo_intermediate::foo_intermediate; 

private: 
    friend class foo_intermediate; 

    // Actual implementation for the foo function goes here 
    void foo_impl() const; 
}; 

// In some CPP file: 
void foo_intermediate::foo() const 
{ 
    // Need to access the typename foo via namespace (global here) 
    static_cast<const ::foo*>(this)->foo_impl(); 
} 

:

void bar() 
{ 
    foo x; 
    x.foo(); // <- illegal attempt to access to the foo constructor 
} 

당신에게 해야합니다 별칭을 통해 액세스 :

void baz() 
{ 
    foo x; 
    base& rx = x; 
    rx.foo(); // legal 
} 
대안으로

, 당신은 사용할 수있는 typedef :

class foo_impl : public base 
{ 
public: 
    virtual void foo() const override; 
}; 

using foo = foo_impl; 

더 이상 생성자 접속으로 나타납니다 때문에이 x.foo()를 호출의 문제를 해결 얻을 수 없습니다.


I made a Gist 그래서 다른 사람들은 그렇게 기울이면 두 가지 해결책을 가지고 놀 수 있습니다.

1

C++에서 클래스 이름을 가질 수있는 유일한 방법은 해당 생성자입니다. 그래서, 아니. 당신은 할 수 없습니다.

4

나는 야생의 추측을 가지고 단지 아니오라고 말할 것입니다.

C++에서 모호함을 많이 겪을 수 있습니다 (때로는 명확하게 구분해야 함). 그러나 컴파일러 나 프로그래머가 이러한 상황을 어떻게 모호하게 할 수 있는지도 보지 못합니다. 글쎄, 프로그래머는 (리턴 타입을 가진 함수는 분명히 생성자가 아니다) C++은 할 수 없다.

7

클래스 나 메서드의 이름을 변경하지 않아도되는 방법이 있습니까?

아니요, 없습니다.

foo이라는 모든 메서드는 class foo에서 특별하며 생성자입니다. 따라서 멤버 함수는 virtual을 재정의 할 수 없습니다.

관련 문제