从 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?
    }
};