我在类层次结构中遇到了一个问题,至今我都无法解决。下面是最小的示例,其中模板Base
类本身继承自另一个不是模板的类(在下面的示例中称为AbsoluteBase
)。类Derived
然后从Base
继承其模板参数也被Bases'
模板参数:在初始化列表中通过模板类构造函数调用非模板基类的构造函数
#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
一路。但是,编译代码时,我得到:
error: no matching function for call to 'AbsoluteBase::AbsoluteBase()'
note: candidates are: AbsoluteBase::AbsoluteBase(int)
note: candidate expects 1 argument, 0 provided
制作的作品Base
的实例得很好,但在Derived
初始化列表调用其构造函数时,编译器要AbsolutBase()
作为构造即使整数给出参数。显然,在AbsoluteBase
中定义默认构造函数时,print()
函数会输出垃圾,因为没有值传递给number
。
因此,我的电话Base<T>::Base(int)
有些事情必须是错的,但我看不到它是什么。我很感谢每一个解释和帮助!
问候, Benniczek
现在我感到愚蠢,因为错字...但它不是在我的编译代码中,只是在我的帖子上面。关于虚拟继承:嗯,我不知道...我使用虚拟继承,因为钻石问题可能发生在进一步的代码中,但不知道这个规则在大多数派生类中的初始化。感谢那! – Benniczek