지금까지 해결할 수 없었던 클래스 계층 구조에서 문제가 발생했습니다. 아래에서 템플릿 Base
클래스 자체가 템플릿이 아닌 다른 클래스 (아래 예제에서는 AbsoluteBase
)에서 상속하는 최소 예제를 얻습니다.초기화 목록의 템플릿 클래스 생성자를 통해 비 템플릿 기본 클래스의 생성자를 호출합니다.
#include <iostream>
using namespace std;
class AbsolutBase {
protected:
int number;
AbsoluteBase(int _number) {
number = _number;
}
virtual ~AbsoluteBase() {}
virtual void print() const = 0;
};
template <typename T> class Base : virtual public AbsoluteBase {
public:
Base(int _number) : AbsoluteBase(_number) {}
virtual void print() const {
cout << number << endl;
}
};
template <typename T> class Derived : public Base<T> {
public:
Derived(int _number) : Base<T>::Base(_number) {}
};
int main() {
Derived<char> object(100);
object.print();
}
그래서 각 생성자는 부모의 생성자를 호출하고 인자로 내려 AbsoluteBase
모든 방법을 정수를 전달합니다 클래스 Derived
다음의 템플릿 인수는 Bases'
템플릿 인수 인 상태 Base
에서 상속됩니다. 코드를 컴파일 할 때 내가 얻을 : Derived
의 초기화 목록에 생성자를 호출 할 때
error: no matching function for call to 'AbsoluteBase::AbsoluteBase()'
note: candidates are: AbsoluteBase::AbsoluteBase(int)
note: candidate expects 1 argument, 0 provided
이 잘 Base
작품의 인스턴스를 만들기하지만, 컴파일러는 정수의 인수가 주어진 경우에도 생성자로 AbsolutBase()
를 원한다. 분명히, AbsoluteBase
에 기본 생성자를 정의 할 때 print()
함수는 가비지 값을 출력하지 않고 number
에 전달했습니다.
내 전화 Base<T>::Base(int)
에 뭔가 이상한 점이 있지만 그게 무엇인지는 알 수 없습니다. 모든 설명과 도움에 감사드립니다!
인사말, Benniczek
지금은 오타 때문에 멍청하다고 느낍니다. 그러나 위의 게시물에서 컴파일 된 코드에는 없습니다. 가상 상속에 관해서 : 아아, 나는 그 사실을 모르고 ... 다이아몬드 상속 문제가 더 많은 코드에서 발생할 수 있기 때문에 가상 상속을 사용했지만 대부분의 파생 클래스에서 초기화에 대해이 규칙을 알지 못하기 때문에 가상 상속을 사용했습니다. 고마워! – Benniczek