Как вызвать функцию дочернего класса из вектора базового класса?
Есть базовый класс Matrix, есть также подкласс SQUARE_MATRIX. В main есть вектор указателей на Matrix. Так как вызвать функцию из SQUARE_MATRIX? class "Matrix" не содержит члена "FIND_MAX_MIN_DIAGONAL" Matrix. Выдаёт такую ошибку.
class Matrix {
protected:
int COLUMNS, ROWS;
int MAX, MIN;
vector<int> MAX_IN_COLUMN; // MAX ELEMENT IN ALL COLUMN
vector<int> MIN_IN_COLUMN; // MIN ELEMENT IN ALL COLUMN
vector<int> MAX_IN_ROW; // MAX ELEMENT IN ALL ROWS
vector<int> MIN_IN_ROW; // MIN ELEMENT IN ALL ROWS
vector<vector<int>> MATRX; // MATRIX
public:
Matrix(int clm = 0, int row = 0) {
COLUMNS = clm;
ROWS = row;
MATRX.assign(clm, vector<int>(row));
MAX = 0;
MIN = 0;
}
friend void MATRIX_ADDITION_DB(vector<shared_ptr<Matrix>> &matrx, int); /// ADDITON MATRIX FROM DATABASE
friend void MATRIX_SUBTRACTION_DB(vector<shared_ptr<Matrix>> &matrx, int); /// SUBTRACTION MATRIX FROM DATABASE
friend void MATRIX_MULTIPLICATION_DB(vector<shared_ptr<Matrix>> &matrx, int); /// MULTIPLICATION MATRIX FROM DATABASE
friend void MATRIX_SORT(vector<shared_ptr<Matrix>> &matrx, int); /// SORT MATRIX
void FIND_MAX();
void FIND_MIN();
void FIND_MAX_AND_MIN_IN_ALL_COLUMN();
void FIND_MAX_AND_MIN_IN_ALL_ROW();
void FILL_RANDOM_MATRIX(int, int);
void FILL_MATRIX();
void SHOW_MATRX();
void SHOW_MAX_MIN();
//void setColumns(int clm) { COLUMNS = clm; } // SET COLUMNS
int getColumns() { return COLUMNS; } // GET COLUMNS
//void setRows(int rows) { ROWS = rows; } // SET ROWS
int getRows() { return ROWS; } // GET ROWS
int getMax() { return MAX; } // GET MAX
int getMin() { return MIN; } // GET MIN*/
};
//// SQUARE_MATRIX CLASS /////////
class SQUARE_MATRIX : virtual public Matrix {
private:
int MAX_IN_MAIN_DG; // MAX IN MAIN DIAGONAL
int MIN_IN_MAIN_DG; // MIN IN MAIN DIAGONAL
int MAX_IN_NMAIN_DG; // MAX IN NOT MAIN DIAGONAL
int MIN_IN_NMAIN_DG; // MIN IN NOT MAIN DIAGONAL
public:
SQUARE_MATRIX(int m) : Matrix(m, m) {
MAX_IN_MAIN_DG = 0; // MAX IN MAIN DIAGONAL
MIN_IN_MAIN_DG = 0; // MIN IN MAIN DIAGONAL
MAX_IN_NMAIN_DG = 0; // MAX IN NOT MAIN DIAGONAL
MIN_IN_NMAIN_DG = 0; // MIN IN NOT MAIN DIAGONAL
}
void FIND_MAX_MIN_DIAGONAL();
int getMAX_IN_MAIN_DG() { return MAX_IN_MAIN_DG; } // GET MAX IN MAIN DIAGONAL
int getMIN_IN_MAIN_DG() { return MIN_IN_MAIN_DG; } // GET MIN IN MAIN DIAGONAL
int getMAX_IN_NMAIN_DG() { return MAX_IN_NMAIN_DG; } // GET MAX IN NOT MAIN DIAGONAL
int getMIN_IN_NMAIN_DG() { return MIN_IN_NMAIN_DG; } // GET MIN IN NOT MAIN DIAGONAL
};
int main() {
vector<shared_ptr<Matrix>> matrx;
matrx.push_back(make_shared<SQUARE_MATRIX>(5));
....
}
Ответы (2 шт):
Автор решения: HolyBlackCat
→ Ссылка
Если вы точно уверены, что matrx[0] указывает на объект SQARE_MATRIX, тогда используйте static_cast:
static_cast<SQUARE_MATRIX &>(*matrx[0]).FIND_MAX_MIN_DIAGONAL();
Если не уверены, и при этом Matrix полиморфный (содержит хотя бы одну виртуальную функцию), тогда можно использовать dynamic_cast. Если не угадаете тип, получите исключение:
dynamic_cast<SQUARE_MATRIX &>(*matrx[0]).FIND_MAX_MIN_DIAGONAL();
Автор решения: AR Hovsepyan
→ Ссылка
std::static_pointer_cast<SQUARE_MATRIX>(matrx[0])->FIND_MAX_MIN_DIAGONAL();