【问题标题】:LNK2019 with pure virtual assignment(=) operator in multilevel class hierarchy?LNK2019 在多级类层次结构中具有纯虚拟赋值(=)运算符?
【发布时间】:2013-06-11 01:22:45
【问题描述】:

好吧,也许我太累了,无法思考这个问题的解决方案,我在互联网上查找了很多类似的问题,但没有找到。所以这是我糟糕的代码:

class X
{
public:
    virtual const X& operator =( const X& ) = 0;
};

class Y : public X
{
public:
         virtual const X& operator =( const X& x )
         {
             return *this;
         }
};

class Z : public Y
{
};


int main_08(int argc, char* argv[])
{
    Z z1;
    Z z2;
    z1 = z2;
    return 0;
}

根据我的预期,代码应该可以正常运行,因为由于类 Z 的赋值没有被覆盖,它应该指向定义的 Y 的赋值运算符。所以在写“z1 = z2”时,应该调用其基类的赋值运算符。当我注释掉这一行时,代码运行良好

相反,我得到 LNK2019 说:


错误 LNK2019:无法解析的外部符号“public: virtual class X const & __thiscall X::operator=(class X const &)”(??4X@@UAEABV0@ABV0@@Z) 在函数“public: class”中引用Y & __thiscall Y::operator=(class Y const &)" (??4Y@@QAEAAV0@ABV0@@Z)


我很困惑,想不通虚函数路由机制是如何让我调用 X::operator =( const X& ) 的。有什么想法吗?

【问题讨论】:

    标签: c++ inheritance operator-overloading virtual-functions lnk2019


    【解决方案1】:

    Y 没有复制赋值运算符。它有一个来自X 的赋值运算符,但这不是一回事。所以编译器生成一个。生成的运算符以非虚拟方式自动调用X 的赋值运算符,即它实际上想要调用X::operator=,而不是任何覆盖它的东西。

    Z 还得到一个生成的赋值运算符,它调用Y 的赋值运算符。所以你得到了X::operator=的实际实现的参考,你没有提供。

    不过,从根本上说,分配和层次结构并不能很好地混合。您将遇到切片问题。不要使属于多态层次结构的类可分配(或根本可复制)。这不是一个好主意。

    【讨论】:

      【解决方案2】:

      编译器为 Z 类生成的operator = 将调用基类中的operator =

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-21
        • 2011-04-15
        • 2012-03-17
        • 2010-10-14
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多