Если M
и N
являются частными для Matrix
, а BinaryMatrix
происходит от Matrix
, я не уверен, почему ваш код компилируется (у вас не должно быть доступа к M, N в BinaryMatrix
).Если ваша декларация BinaryMatrix
также включает членов M
и N
(а также Matrix::N
и Matrix::M
), то это может быть источником проблемы.
Если BinaryMatrix
нене объявляйте M
и N
, тогда я думаю, что у нас все еще недостаточно данных для диагностики вашей проблемы.Чтобы немного догадаться, возможно, M * N не вписывается в тип, используемый для M. Таким образом, у вас есть арифметическое переполнение.Размер массива указан в size_t
, поэтому приведение будет работать нормально.
Кроме того, вы, вероятно, хотите делегировать управление данными точно одному из классов.То есть, сделайте это:
BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) : Matrix(copy)
{
// M, N, data already set in Matrix::Matrix(const Matrix&)
// The data has also been copied, so there is nothing to do here.
}
или это:
#include <algorithm>
BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy)
: Matrix(), M(0), N(0),
data(0) // null in case new throws an exception (avoid bad delete in dtor).
{
const size_t nelems(size_t(copy.M)*size_t(copy.N));
data = new double[nelems];
M = copy.M;
N = copy.N;
stl::copy(copy.data, copy.data+nelems, data);
}
Я думаю, что в общем случае не рекомендуется использовать int
для итерации динамических структур данных, посколькуничто не гарантирует, что фактический размер структуры вписывается в int
.Однако эта гарантия существует для size_t
(любой существующий объект должен иметь размер, представляемый в size_t
, поэтому вы можете перебирать любой смежный объект, используя size_t
).
На самом деле я недействительно уверен, какое различие (цели или поведения) вы пытаетесь получить от Matrix
и BinaryMatrix
.Данные, похоже, имеют одинаковое представление.Если это различие в поведении, а не в представлении, которое вы ищете, я думаю, что было бы лучше использовать композицию (то есть, отдельный не наследуемый класс представления), а не наследование.См. Что такое принцип подстановки Лискова? для объяснения того, как полезно думать о том, когда использовать наследование.
Однако, если ни один из ответов, которые вы видели до сих пор, на самом деле не помогает решитьваша проблема, вы должны уделить некоторое время сокращению вашего примера: какая самая маленькая полная программа-пример, которая демонстрирует вашу проблему?Опубликовать это.