繁体   English   中英

在继承的类的构造函数中调用基类的构造函数

[英]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 ,在这种情况下,模板参数TRandomBase

令人困惑的是为什么既要组成该类型的包装,又要从中继承。

您可以从RandomBase继承(已经存在),也可以从Wrapper<RandomBase>继承或Wrapper<RandomBase>它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM