다중 상속 및 가상 상속을 방지하기 위해 템플릿 상속을 사용하도록 선택했습니다. 내 목표는 다양한 자식 (4 또는 5 세대 또는 제어 할 수없는 상속)을 파생시키는 것과 관계없이 공통 함수 호출을 만드는 것입니다.템플릿 상속을 사용하여 조부모 생성자 호출
은 내 솔루션도록 템플릿 상속을 삽입한다 :
template <typename BASE>
class common_call : public BASE {
public:
void foo() { /*implementation independent of base*/ }
};
class child1 : public common_call <base1> {};
class child2 : public common_call <base2> {};
이베이스의 생성자를 호출하는 문제가있다. Base1과 Base2 클래스 (저에게 쓰여지지 않은 클래스)는 초기화 목록에서 호출해야하는 생성자가 다릅니다. common_call 템플릿은 이러한 생성자에 대해 아무 것도 모릅니다. 그러나 자식 클래스는 현재 자신이 직접 상속하는대로 수행합니다. 내가베이스 가능한 경우의 각 유형에 대한 부분 템플릿 특수화을 피하기 위해 노력하고있어
class child3 : public common_call<base3>{
public:
child3(param1, param2) : base3(param2) {/*do things here*/}
};
:
내가이 작업을 수행 할 수있는 방법이 있습니까.
당신은 C++ 11을 사용하고 있습니까? 이 경우 variadic 템플릿과 완벽한 포워딩을 사용하여 모든 인수를 현재 기본 클래스에 전달하는 'common_call'에 생성자를 추가 할 수 있습니다. – Grizzly
구현이 기본 클래스와 관련이 없다면 단순히'base'와'common_call'의 상속을 개별적으로 상속하지 않는 것이 어떻습니까? – Puppy
내가 언급 한 것을 잊어 버린 몇 가지 사실 : foo() 함수는 공통 조상 ANCESTOR (base1, base2 및 base3 do)에서 파생되는 한 BASE 유형에 의존하지 않습니다. 반면에 자식 클래스는 base1 등으로부터 파생되어야합니다. 그래서 ANCESTOR를 두 번 상속받지 않도록하려고합니다. 불행히도 제 환경에서는 C++ 11이 아직 허용되지 않습니다. 그것이 있었다면 많은 문제가 사라질 것입니다. – Filipp