코드를 살펴보십시오.기본 클래스에 대한 참조를 사용하여 파생 클래스의 private 멤버 함수에 액세스
class Abstract_base {
public:
virtual ~Abstract_base() {}
virtual void f1() = 0;
virtual void f2() = 0;
};
기본 클래스는 다음과 같습니다 :
class Base : public Abstract_base {
public:
virtual ~Base() {}
virtual void f1() override { cout << "f1" << endl; }
virtual void f2() override { cout << "f2" << endl; }
};
나는 다음과 같이 두 개의 파생 클래스가 있습니다
class Derived_1 : public Base {
public:
virtual ~Derived_1() {}
private:
virtual void f2() override { cout << "Derived_1::f2()" << endl; }
};
class Derived_2 : public Base {
public:
virtual ~Derived_2() {}
private:
virtual void f1() override { cout << "Derived_2::f1()" << endl; }
};
을 마지막으로 내가 처리기가 I는 다음과 같다 인터페이스를 다음과 같은 클래스 :
class Handler {
public:
Handler (Abstract_base& b) : base (b) {}
virtual ~Handler() {}
void process_1() {
base.f1();
}
void process_2() {
base.f2();
}
private:
Abstract_base& base;
};
그리고 MAIN.CPP은 다음과 같습니다 der1.f2()와 der2.f1()가 개인이기 때문에
int main (int argc, char** argv) {
Derived_1 der1;
der1.f2();
Derived_2 der2;
der2.f1();
Handler handler1 (der1);
handler1.process_2();
Handler handler2 (der2);
handler2.process_1();
return 0;
}
물론 코드는 컴파일되지 않습니다,하지만 난이 두 가지 지시 사항을 주석 경우와 handler1을 둡니다. process_2()와 handler2.process_1() 명령, 코드를 컴파일하고 생성합니다 출력 :
Derived_1::f2()
Derived_2::f1()
질문 :
가 어떻게 토륨 참조를 사용하여이 두 개인 멤버 함수를 호출 방지 할 수 있습니다 Abstract_base 클래스? 사용자가 Derived_1의 f2() 및 Derived_2의 f1()에 액세스 할 수 없도록하려는 것입니다.
필자가 아는 한 Derived_1 :: f2() 및 Derived_2 :: f1()에 delete 키워드를 사용할 수 없습니다.
이 문제에 대한 해결책을 제안 해 주시겠습니까?
솔루션
나는 해결책 중 하나가 처리기이 같은 템플릿 클래스를 만들 수 있다는 것을 알고
template <class B>
class Handler_templ {
public:
Handler_templ (B& b) : base (b) { }
virtual ~Handler_templ() {}
void process_1() {
base.f1();
}
void process_2() {
base.f2();
}
private:
B& base;
};
과 같이 사용 :
Handler_templ<Derived_1> h1 (der1);
Handler_templ<Derived_2> h2 (der2);
h1.process_2();
h2.process_1();
놀라운 무엇 왜 Handler 클래스를 사용하여 이러한 private 멤버 함수를 호출 할 수 있습니까? 어떤 제안이라도 매우 감사 할 것입니다. 감사합니다
, 아르투르
'Handler' 클래스를 사용하면'Abstract_base'에 대한 참조를 통해 메소드에 액세스합니다.이 참조는 함수의 액세스를 결정하는 데 사용됩니다 (여기서는'public'). 따라서 코드가 컴파일됩니다. – Niall