2013-03-14 109 views
3

您能解释下面代码的输出吗?我需要做什么来调用正确的基类构造函数?派生类调用错误的基类构造函数

谢谢。

#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) 

我预期

SequenceComposite(n, val, alloc) 
VectorComposite(n, val, alloc) 
MyModel(n, val) 

SequenceComposite(x) 
VectorComposite(x) 
MyModel(x) 
... 
+4

请参阅:http://stackoverflow.com/questions/2126522/c-virtual-inheritance – 2013-03-14 11:16:02

+2

你期望什么? – 2013-03-14 11:16:13

+0

为什么你甚至使用虚拟继承? – Grizzly 2013-03-14 11:17:06

回答

2

虚拟基类是从最派生类型的构造器进行初始化。因此在前两个示例中,调用SequenceComposite的默认构造函数。这是一个allocator_type与默认参数。要使用不同的构造函数,请从最大派生类型的初始化程序列表中调用它。

相关问题