从 overriden 访问 derived class 的成员元素
Access member elements of derived class from overriden
如何在覆盖复制运算符重载函数后访问派生的 class?
我是 OOP C++ 的新手,所以我不确定将运算符重载定义为纯虚拟是否可行;否则,我将如何强制在派生的 classes?
中定义它们?
我在这里使用的示例是 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 ?
};
};
如评论中所述,您可以在传递的 reference 上使用 dynamic_cast
来测试它是否引用 actual 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!
}
但是(也在评论中指出),dynamic_cast
到 引用 将在失败时抛出异常(即如果传递的参数是 不是对RMMatrix
)的引用。
如果您想避免抛出异常,并添加一些其他 error-handling 行为,那么您可以在 地址 传递的参数。这将 return 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?
}
};
如何在覆盖复制运算符重载函数后访问派生的 class?
我是 OOP C++ 的新手,所以我不确定将运算符重载定义为纯虚拟是否可行;否则,我将如何强制在派生的 classes?
中定义它们?我在这里使用的示例是 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 ?
};
};
如评论中所述,您可以在传递的 reference 上使用 dynamic_cast
来测试它是否引用 actual 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!
}
但是(也在评论中指出),dynamic_cast
到 引用 将在失败时抛出异常(即如果传递的参数是 不是对RMMatrix
)的引用。
如果您想避免抛出异常,并添加一些其他 error-handling 行为,那么您可以在 地址 传递的参数。这将 return 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?
}
};