[英]Access member elements of derived class from overriden
覆蓋復制運算符重載函數后如何訪問派生類?
我是 OOP C++ 的新手,所以我不確定是否將運算符重載定義為純虛擬作品; 否則,我將如何強制在派生類中定義它們?
我在這里使用的示例是一個 Matrix 接口和一個行優先的特定實現。
class IMatrix
{
public:
virtual IMatrix& operator=(const IMatrix& matrix) = 0;
};
class RMMatrix : public IMatrix
{
long double* data;
public:
RMMatrix& operator=(const IMatrix& other) override
{
// how to get access to data here then ?
};
};
如評論中所述,您可以在傳遞的引用上使用dynamic_cast
來測試它是否引用了實際的RMMatrix
對象。 像這樣的東西:
RMMatrix& operator=(const IMatrix& other) override {
const RMMatrix& test = dynamic_cast<const RMMatrix&>(other);
data = test.data;
return *this; // return a reference to "this" object!
}
但是(也在評論中指出),如果失敗(即如果傳遞的參數不是對RMMatrix
的引用),則對引用的dynamic_cast
將引發異常。
如果您想避免拋出異常,並添加一些其他錯誤處理行為,那么您可以在傳遞的參數的地址上使用指針dynamic_cast
。 這將在失敗時返回nullptr
,而不是拋出異常:
class IMatrix {
public:
virtual IMatrix& operator=(const IMatrix& matrix) = 0;
virtual ~IMatrix() = default; // We should add a VIRTUAL destructor!
};
class RMMatrix : public IMatrix {
long double* data;
public:
RMMatrix& operator=(const IMatrix& other) override {
const RMMatrix* testPtr = dynamic_cast<const RMMatrix*>(&other); // Test cast the address!
if (testPtr != nullptr) { // Passed argument is a VALID reference...
data = testPtr->data;
// You would really need something safer here, rather than just copying the data pointer!
}
else { // Passed argument is NOT a reference to an RMMatrix...
// Handle 'error': Leave "data" unchanged, set it to "nullptr", or throw an exception?
//...
}
return *this; // return a reference to "this" object!
}
~RMMatrix() override { // Override VIRTUAL destructor!
delete data; // Maybe?
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.