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=
的实际实现的引用,而您没有提供它
不过,更根本的是,分配和层次结构不能很好地结合。您将遇到切片问题。不要让属于多态层次结构一部分的类可赋值(或完全可复制)。这不是个好主意