2016-06-28 2 views
9

이 내 코드 컴파일되지 않습니다멤버 함수가 상속되지 않습니까?

class B { 
public: 
    virtual void insert(int t, int p) = 0; 

    void insert(int t) { 
    insert(t, 0); 
    } 
}; 

class D : public B { 
public: 
    void insert(int t, int p) { } 

}; 

int main() { 
    D d; 
    d.insert(1); 
} 

입니다. 물론, 만약 내가 d.B :: insert (1)을 main에 쓰면 그렇게 될 것입니다. 그러나 왜 이것이 틀린 것입니까? 감사.

+0

https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule 참조 – Oktalist

답변

0

D에서 "삽입"함수를 재정의했기 때문에 확신합니다. 호출되는 함수입니다. 클래스 "D"에 "insert"함수는 하나가 아니라 두 개의 매개 변수를 필요로합니다. d.B :: insert (1)을 수행하면 B에서 "삽입"이라고 부릅니다.

9

이것은 기본 클래스 함수가 ​​과부하 해결에 포함되지 않았기 때문입니다. 비슷한 상황은 내부 범위에서 선언 된 함수와 비슷합니다. 외부 범위에서 선언 된 함수에 과부하가 걸리지 않습니다 (아래 예 참조). 파생 클래스 범위가 기본 클래스 범위 안에 중첩되어 있다고 상상할 수 있습니다.

컴파일러가 D::insert 후보를 찾으면 기본 클래스를 더 이상 볼 수 없습니다. D::insert이 없으면 컴파일러는 insert 메서드 호출을위한 기본 클래스를 조사합니다. 당신과 기본 클래스에서 insert 함수 이름을 도입하여이 문제를 해결할 수 있습니다

using B::insert; 

이 파생 클래스의 모든 B::insert 오버로드 기능을 소개합니다. 다른 상황에서 같은 방법으로 어떻게 과부하 작품

d.B::insert(1) 

샘플 코드 : 또는 당신이 말한대로, 당신은 명시 적으로 기본 클래스 메서드를 호출 할 수 있습니다

namespace Outer { 
    void foo(double d) { 
    std::cout << "Outer::foo(double d)\n"; 
    } 
    namespace Inner { 
    //using Outer::foo; // uncomment to see "Outer::foo(double d)" in output 
    void foo(int n) { 
     std::cout << "Inner::foo(int n)\n"; 
    } 
    void callMe() { 
     foo(1.1); 
    } 
    } 
} 

int main() { 
    Outer::Inner::callMe(); // Outputes: Inner::foo(int n) 
} 

나 :

void foo(std::string s) { 
    std::cout << "foo(std::string s)\n"; 
} 

void foo(double d) { 
    std::cout << "foo(double d)\n"; 
} 

void foo(int n) { 
    std::cout << "foo(int n)\n"; 
} 

int main() { 
    void foo(int d); // comment out to see foo(double d) in output 
    foo(1.1); // outputs: "foo(int n)", foo(double d) is hidden 
    //foo("hello"); // ups, it wont compile - name lookup in c++ happens before type checking 
        // commenting out `void foo(int d);` above will fix this. 
} 
관련 문제