簡體   English   中英

動態綁定到函數取決於C ++中的參數

[英]Dynamic binding to function depending on arguments in C++

我期望賦值運算符根據參數類型動態綁定:

struct NumberObject;
struct NumberString;

struct DataType
{
    virtual void operator=(DataType& rhs) {};
    virtual void operator=(NumberString& rhs) {};
};
struct NumberObject : DataType
{
    double data = 7;
    void operator=(DataType& rhs)  override
    {
        std::cout << "Copying from DataType\n"; 
// The assignment operator that's called is this one. I was hoping it would be the one below.
    }
    void operator=(NumberString& rhs) override
    {
        std::cout << "Copying from NumberString\n";
    }
};
struct NumberString : DataType
{
    std::string data = "7";
    void operator=(NumberString& rhs) override{};
};


int main()
{
    DataType *pDataType1, *pDataType2;
    pDataType1 = new NumberObject;
    pDataType2 = new NumberString;
    *pDataType1 = *pDataType2;   // Both pointers are to DataType, I was hoping that the assignment operator taking 
                            // NumberString as the right hand side would be called


    return 0;
}

由此我猜測C ++不能基於參數類型動態綁定函數。 動態綁定僅在直接通過對象調用函數時發生。 所以我認為我可以做到這一點,但它看起來像一個迂回的方式:

struct NumberObject : DataType
{
    double data = 7;
    void operator=(DataType& rhs)  override
    {
        std::cout << "Copying from DataType\n";
        rhs.assignTo(*this);
    }
    void operator=(NumberString& rhs) override
    {
        std::cout << "Copying from NumberString\n";
    }
};
struct NumberString : DataType
{
    std::string data = "7";
    void assignTo(NumberObject& lhs) override 
    {// Provided the base class had this
        lhs.data = atof(this->data.c_str());
    }

    void operator=(NumberString& rhs) override{};
};

這看起來像是一個黑客,並且看到語言能夠動態綁定,這不是一件容易做到的事嗎? 這是語言的弱點嗎? 或者沒人關心它?

通過雙重調度,它將是:

struct NumberObject;
struct NumberString;

struct DataType
{
    virtual ~DataType() = default;
    virtual void operator=(const DataType&) = 0;
    virtual void assignTo(NumberObject&) const = 0;
    virtual void assignTo(NumberString&) const = 0;
};

struct NumberObject : DataType
{
    double data = 7;
    void operator=(const DataType& rhs) override { rhs.assignTo(*this); }

    void assignTo(NumberObject& rhs) const override
    {
        std::cout << "Copying from NumberObject\n"; 
    }
    void assignTo(NumberString& rhs) const override
    {
        std::cout << "Copying from NumberObject\n";
    }
};

struct NumberString : DataType
{
    std::string data = "7";
    void operator=(const DataType& rhs) override { rhs.assignTo(*this); }

    void assignTo(NumberObject& rhs) const override
    {
        std::cout << "Copying from NumberString\n"; 
    }
    void assignTo(NumberString& rhs) const override
    {
        std::cout << "Copying from NumberString\n";
    }
};

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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