派生类调用了错误的基类构造函数
derived class calls wrong base class constructor
你能解释一下下面代码的输出吗?我需要做什么来调用正确的基类构造函数?
谢谢。
#include <vector>
#include <iostream>
template <class CONTAINER> class SequenceComposite {
protected:
CONTAINER m_data;
public:
typedef typename CONTAINER::value_type value_type;
typedef typename CONTAINER::allocator_type allocator_type;
typedef typename CONTAINER::size_type size_type;
explicit SequenceComposite(const allocator_type& alloc = allocator_type()) : m_data(alloc) {
std::cout << std::endl << "SequenceComposite(alloc)" << std::endl;
}
explicit SequenceComposite(size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type()) : m_data(n, val, alloc) {
std::cout << std::endl << "SequenceComposite(n, val, alloc)" << std::endl;
}
SequenceComposite(const SequenceComposite& x) : m_data(x.m_data) {
std::cout << std::endl << "SequenceComposite(x)" << std::endl;
}
};
template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> > {
public:
typedef typename VectorComposite::value_type value_type;
typedef typename VectorComposite::allocator_type allocator_type;
typedef typename VectorComposite::size_type size_type;
explicit VectorComposite(const allocator_type& alloc = allocator_type()) : SequenceComposite< std::vector<DTYPE> >(alloc) {
std::cout << "VectorComposite(alloc)" << std::endl;
}
explicit VectorComposite(size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type()) : SequenceComposite< std::vector<DTYPE> >(n, val, alloc) {
std::cout << "VectorComposite(n, val, alloc)" << std::endl;
}
VectorComposite(const VectorComposite& x) : SequenceComposite< std::vector<DTYPE> >(x) {
std::cout << "VectorComposite(x)" << std::endl;
}
};
template<typename T> class MyModel : public virtual VectorComposite<T> {
public:
MyModel() {
std::cout << "MyModel()" << std::endl;
};
MyModel(const MyModel<T> &vec) : VectorComposite<T>(vec) {
std::cout << "MyModel(x)" << std::endl;
}
MyModel( size_t n, const T& value= 0) : VectorComposite<T>(n, value) {
std::cout << "MyModel(n, val)" << std::endl;
}
};
int main() {
MyModel<float> c(4, 2.0);
MyModel<float> e(c);
VectorComposite<float> a(3, 2.0);
VectorComposite<float> b(c);
return 0;
}
输出:
SequenceComposite(alloc)
VectorComposite(n, val, alloc)
MyModel(n, val)
SequenceComposite(alloc)
VectorComposite(x)
MyModel(x)
SequenceComposite(n, val, alloc)
VectorComposite(n, val, alloc)
SequenceComposite(x)
VectorComposite(x)
I expected
SequenceComposite(n, val, alloc)
VectorComposite(n, val, alloc)
MyModel(n, val)
SequenceComposite(x)
VectorComposite(x)
MyModel(x)
...
虚基类是从派生最多的类型的构造函数初始化的。因此,在前两个示例中,调用SequenceComposite
的默认构造函数。它接受一个带有默认参数的allocator_type
。若要使用不同的构造函数,请从最派生类型的初始化列表中调用它。
相关文章:
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 在成员构造函数之后调用基类构造函数
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 如何在 C++ 中将参数传递给基类构造函数
- 将数据成员的指针传递给基类构造函数是否安全?
- 使用基类构造函数初始化儿童类
- 使用基类构造函数的子类构造函数的大纲定义
- MSVC 无法识别继承模板类的模板类的"直接"基类构造函数
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- 是否可以使用基类构造函数通过派生类将值初始化为基类私有成员?
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数
- 是否可以在运行时切换到不同的基类构造函数?
- 对基类构造函数的未定义引用
- 如何为基类构造函数中的每个子类执行特定任务
- 将类传递到基类构造函数的模板参数中?
- 如何在基类构造函数中使用派生类成员
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 使用相同的参数调用基类C++构造函数