【问题标题】:Invoking base class constructor in constructor of inherited class在继承类的构造函数中调用基类构造函数
【发布时间】:2018-03-31 09:37:19
【问题描述】:

我正在查看book 中的包装类示例。包装类本身显示在本文的末尾。

在本书的第 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

包装取自here

【问题讨论】:

  • Wrapper 解引用运算符返回一个指针,这没有多大意义。也许它应该返回一个引用?
  • @某程序员老兄:即便如此,它也不应该转换为构造函数要求的 unsigned long。
  • 说的差不多。
  • 父类还能如何初始化自己?与析构函数不同,构造函数调用不会自动调用继承层次结构。

标签: c++ oop


【解决方案1】:

错误:

invalid conversion from ‘const RandomBase*’ to ‘long unsigned int

不言自明,构造函数:

RandomBase(unsigned long Dimensionality);

需要一个unsigned long,但在调用时你传递一个*innerGenerator

从概念上讲,您的孩子class AntiThetic 必须在其构造函数中调用基础class RandomBase

所以你要么需要传递正确的参数Dimensionality,要么添加一个空的构造函数。

包装器似乎是一个模板类,它允许存储和检索模板参数T,在本例中为RandomBase

令人困惑的是,为什么既要编写该类型的包装器又要从它继承。

您可以从 RandomBase 继承(正如您已经是),从 Wrapper&lt;RandomBase&gt; 继承或组合它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多