我正在努力了解多重继承。显然我选择解决一个非常复杂的问题,它具有多重继承和钻石问题。即使我发现了几个与我的问题相似的案例,例如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
还是我重复使用相同的空间?
因为矩阵的大小可能很大,所以我希望尽可能少地工作。
答案 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*/
)。