【发布时间】:2016-11-04 21:11:48
【问题描述】:
我在类层次结构中遇到了一个到目前为止我无法解决的问题。下面是一个最小示例,其中模板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) 的调用肯定有问题,但我看不出它是什么。我很感激每一个解释和帮助!
您好, 本尼切克
【问题讨论】:
标签: c++ templates inheritance constructor