C++ 在多级类层次结构中使用纯虚拟赋值(=)运算符的LNK2019?

C++ 在多级类层次结构中使用纯虚拟赋值(=)运算符的LNK2019?,c++,inheritance,operator-overloading,virtual-functions,lnk2019,C++,Inheritance,Operator Overloading,Virtual Functions,Lnk2019,好吧,也许我太累了,想不出这个问题的解决办法,我在网上找了很多类似的问题,但没有找到。这是我的可怕代码: class X { public: virtual const X& operator =( const X& ) = 0; }; class Y : public X { public: virtual const X& operator =( const X& x ) { return

好吧,也许我太累了,想不出这个问题的解决办法,我在网上找了很多类似的问题,但没有找到。这是我的可怕代码:

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&u thiscall X::operator=(class X const&)”(?4X@@UAEABV0@ABV0@@Z) 在函数“public:class Y&u thiscall Y::operator=(class Y const&)”中引用(??4Y@@QAEAAV0@ABV0@@Z)



我感到困惑,无法理解虚拟函数路由机制是如何让我调用X::operator=(const X&)的。有什么想法吗?

编译器为类Z生成的
运算符=
将调用基类中的运算符。

Y
没有复制赋值运算符。它有一个来自
X
的赋值运算符,但这不是一回事。因此编译器生成一个。生成的运算符以非虚拟的方式自动调用
X
的赋值运算符,即它实际上希望调用
X::operator=
,而不是任何重写它的操作

Z
还获取生成的赋值运算符,该运算符调用
Y
的赋值运算符。因此,您得到了一个对
X::operator=
的实际实现的引用,而您没有提供它

不过,更根本的是,分配和层次结构不能很好地结合。您将遇到切片问题。不要让属于多态层次结构一部分的类可赋值(或完全可复制)。这不是个好主意