"프로젝트에서 사적 상속을 사용하고 있습니다." 기본 클래스는 연산자 []를 정의하며, 이것은 내가 사용하고자하는 기능입니다. 따라서, 내가 가지고있다개인 상속 사용 지시문, 과부하?
그러나 어떻게 내가 얻을 수있는 연산자의 버전을 제어 할 수 있습니까? 사실 const
과 const
버전 둘 이상이 필요합니다. 이것이 성취 될 수 있습니까?
"프로젝트에서 사적 상속을 사용하고 있습니다." 기본 클래스는 연산자 []를 정의하며, 이것은 내가 사용하고자하는 기능입니다. 따라서, 내가 가지고있다개인 상속 사용 지시문, 과부하?
그러나 어떻게 내가 얻을 수있는 연산자의 버전을 제어 할 수 있습니까? 사실 const
과 const
버전 둘 이상이 필요합니다. 이것이 성취 될 수 있습니까?
내 이해는 using
에 자동으로 모든 다른 과부하가들 어와 야합니다. 특정 과부하가 하위 클래스로 가져 오지 못하게 할 것입니까? 이 경우 작업을 상위의 몇 가지 다른 이름의 함수로 분할하고 필요한 것만을 using
으로 분할하는 것이 좋습니다.
이 예상대로 수행 : 다른 말로
class A
{
public:
int operator[](int idx) { return 0; }
int operator[](int idx) const { return 1; }
};
class B : public A
{
public:
using A::operator[];
void opa() { cout << operator[](1) << endl; }
void opb() const { cout << operator[](1) << endl; }
};
int main(void)
{
B b;
b.opa();
b.opb();
const B d = B();
cout << d[1] << endl; // should trigger the const version of operator[]
return 0;
}
가 적절한 CONST/비 CONST 버전 B
주입된다. 참고 : const 버전이 제공되지 않으면 컴파일러 오류가 발생합니다 (이 작업은 상속이 비공개 또는 공용인지 여부에 관계없이).
이 경우에는 composition을 사용하여 개인 상속 대신 원하는 결과를 얻을 수 있습니다. – James
그래, 나도 알아 ... 대신 포워딩 코드의 양을 줄이기 위해 사적 상속으로 바꿨다. 그래서 불가능하니? 함수를 어떻게 선택합니까? – carlpett
여기에서 개인 상속 대신 컴포지션을 사용하면 코드를 작성하고 유지 관리하는 것이 훨씬 쉬울 것입니다. 어림짐작은 절대적으로 필요하지 않을 때 C++의 벽이 아닌 기능을 사용하지 않는 것입니다 (지금까지 말한 것에서는이 경우 개인 상속이 필요하지 않음). –