제목에 있는 위 오류는 오버로딩과 오버라이딩을 동시에 사용할 때 볼 수 있는 경고 메세지이다.
일반적으로 오버라이딩을 사용할 땐 부모 클래스의 함수 호출을 하지 않을 확률이 높다.
(동적 바인딩 하므로)
그러나 컴파일러 입장에서는 상속받은 자식 클래스에 똑같은 이름의 함수(오버라이딩 된)가 있으면 부모 클래스의 함수는 가려진다. 사용하지 않는다면 컴파일 에러는 발생하지 않으나 경고는 출력한다.
근데 이게 MSVC같은 컴파일러에선 뜨지 않고 nvcc를 사용할 때 종종 보인다. 그것도 cpp파일에 참조되면 (당연하겠지만) 보이지 않고, cu파일에 참조되면 해당 경고를 출력한다.
해결방법은 using 키워드로 오버라이딩된 오버로드 함수를 선언하는 것이다.
#include<iostream>
class A {
public:
virtual void process(int x) {
std::cout << "A1" << std::endl;
};
virtual void process(int a, float b) {
std::cout << "A2" << std::endl;
}
};
class B : public A {
public:
using A::process;
void process(int x) override{
std::cout << "B1" << std::endl;
}
};
class C :public B {
public:
using B::process;
void process(int a, float b) override {
std::cout << "C2" << std::endl;
}
};
int main(int argc, char *argv[]) {
A* ptr[3];
ptr[0] = new A;
ptr[1] = new B;
ptr[2] = new C;
for (int i = 0; i < 3; i++) {
ptr[i]->process(0);
ptr[i]->process(0, 0);
}
return 0;
}