簡體   English   中英

從 overriden 訪問派生類的成員元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM