使用非默认构造函数进行多重继承的内存分配

时间:2017-06-08 15:57:23

标签: c++ multiple-inheritance diamond-problem

我正在努力了解多重继承。显然我选择解决一个非常复杂的问题,它具有多重继承和钻石问题。即使我发现了几个与我的问题相似的案例,例如this one,我的问题是内存不仅仅是执行顺序。

假设我有以下内容:

class Matrix {
public:
  Matrix(int rows, int Cols) {
    // Build matrix of zeros
  }
};

class Symmetric : public virtual Matrix {
public:
  // It's enough to call Matrix constructor using the same number of rows and cols
  Symmetric(int size) : Matrix(size, size) {}
};

class PosDef : public virtual Matrix {
public:
  // We need different constructor, matrix of zeros is not pos def
  PosDef(int size) {
    // Build matrix of ones
  }
};

class SymmPosDef : public Symmetric, public PosDef {
public:
  // We basically want to use the PosDef constructor that gives symmetric matrix
  SymmPosDef(int size) : Matrix(size, size), Symmetric(size), PosDef(size) {}
};

因为我已经给出了非默认构造函数,所以初始化SymmPosDef对象的唯一方法是使用复杂的链SymmPosDef(int size) : Matrix(size, size), Symmetric(size), PosDef(size) {},我的问题是我要构建多少个矩阵?

我是为Matrix分配一次空间,一次是Symmetric(这是相同的零元素),一次是PosDef还是我重复使用相同的空间?

因为矩阵的大小可能很大,所以我希望尽可能少地工作。

1 个答案:

答案 0 :(得分:0)

Matrix仅在最派生的类中初始化(来自initalizer列表)一次。 但是将调用所有构造函数 body

使用:

class SymmPosDef : public Symmetric, public PosDef {
public:
  SymmPosDef(int size) : Matrix(size, size), Symmetric(size), PosDef(size) {}
};

你会:

  • Matrix(size, size)
  • Symmetric(int size) : Matrix(size, size)跳过)
  • Symmetric(int size)正文(/*Empty*/)。
  • PosDef(int size) : Matrix(size, size)跳过)
  • PosDef(int size)正文(/* Build matrix of ones */
  • SymmPosDef(int size)正文(/*Empty*/)。