[英]Invoking base class constructor in constructor of inherited class
我正在看这本书中包装类的一个例子。 包装类本身显示在本文的结尾。
本书的第94页有一个继承类的示例。 我对构造函数的初始化程序列表中发生的事情有疑问:
class RandomBase
{
public:
RandomBase(unsigned long Dimensionality);
virtual RandomBase *clone() const = 0;
virtual ~RandomBase(){};
private:
unsigned long Dimensionality;
};
class AntiThetic : public RandomBase
{
public:
AntiThetic(const Wrapper<RandomBase> &innerGenerator) : RandomBase(*innerGenerator),
InnerGenerator(innerGenerator) {}
virtual RandomBase *clone() const
{
return new AntiThetic(*this);
}
private:
Wrapper<RandomBase> InnerGenerator;
};
首先,我不能编译它。 我收到错误: error: invalid conversion from 'const RandomBase*' to 'long unsigned int' [-fpermissive]
。 其次,我从概念上不了解当我们调用RandomBase(*innerGenerator)
时发生了什么-我不知道使用C ++可以做到这一点(?)
这是包装器类Wrapper:
#ifndef WRAPPER_H
#define WRAPPER_H
template< class T>
class Wrapper
{
public:
Wrapper()
{ DataPtr =0;}
Wrapper(const T& inner)
{
DataPtr = inner.clone();
}
~Wrapper()
{
if (DataPtr !=0)
delete DataPtr;
}
Wrapper(const Wrapper<T>& original)
{
if (original.DataPtr !=0)
DataPtr = original.DataPtr->clone();
else
DataPtr=0;
}
Wrapper& operator=(const Wrapper<T>& original)
{
if (this != &original)
{
if (DataPtr!=0)
delete DataPtr;
DataPtr = (original.DataPtr !=0) ? original.DataPtr->clone() : 0;
}
return *this;
}
T& operator*()
{
return *DataPtr;
}
const T& operator*() const
{
return *DataPtr;
}
const T* const operator->() const
{
return DataPtr;
}
T* operator->()
{
return DataPtr;
}
private:
T* DataPtr;
};
#endif
包装从这里带走
错误:
invalid conversion from ‘const RandomBase*’ to ‘long unsigned int
是不言自明的,构造函数:
RandomBase(unsigned long Dimensionality);
希望在调用时传递一个*innerGenerator
但该unsigned long
一段*innerGenerator
。
从概念上讲,这是您的子class AntiThetic
必须在其构造函数中调用基class RandomBase
。
因此,您需要传递正确的参数Dimensionality
或添加一个空的构造函数。
包装器似乎是一个模板类,它允许存储和检索模板参数T
,在这种情况下,模板参数T
为RandomBase
。
令人困惑的是为什么既要组成该类型的包装,又要从中继承。
您可以从RandomBase
继承(已经存在),也可以从Wrapper<RandomBase>
继承或Wrapper<RandomBase>
它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.