父类的运算符重载函数会被子类继承吗?比如赋值运算符。
1个回答
展开全部
class widget
{
① widget& operator=( const widget& rhs ){} // 这个叫做赋值操作符
② widget& operator=( const int ) {} // 这个叫做赋值操作符重载
} ;
①. 赋值操作符属于类的复制控制的一部分(默构,复构,赋值,析构), 自己不定义,编译器会自动合成.它的正式叫法是(copy assignment operator),强调的是属于复制控制的一部分.
②. 赋值操作符重载和赋值操作符不一样,你不定义,编译器不会自动合成.
所以你要是问子类赋值操作符会不会继承父类,那肯定是不会的.
1. 如果 子类没定义赋值操作符, 那么 子类会自动合成赋值操作符, 子类在赋值的时候会自动调用父类的赋值操作符来完成基类部分的复制拷贝.
2. 如果 子类自己定义了赋值操作符, 那么 子类就不会继续自动合成, 仍然子类必须手动调用父类的赋值操作符来完成基类部分的赋值拷贝,否则会造成部分复制( partial copy assignment )
但是你要问子类是否会继承 赋值重载运算符,那肯定会.
而且 赋值重载运算符 就和普通函数一样,能够呈现多态行为,
但是 赋值操作符不可能出现多态,因为它不可能是虚函数,虚函数要求函数的签名必须一样(除了返回值).
重载叫做overloading,他在C++中的意思是重新定义一个操作符的语义.
在①中,赋值操作符永远都和同类对象进行赋值拷贝,根本不存在重新定义一个新的语义.
而在②中,可以定义op=( int ), op=(double), op=(gadget),重新定义op=(),使得widget类分别和int, double, gadget对象的赋值有意义.
{
① widget& operator=( const widget& rhs ){} // 这个叫做赋值操作符
② widget& operator=( const int ) {} // 这个叫做赋值操作符重载
} ;
①. 赋值操作符属于类的复制控制的一部分(默构,复构,赋值,析构), 自己不定义,编译器会自动合成.它的正式叫法是(copy assignment operator),强调的是属于复制控制的一部分.
②. 赋值操作符重载和赋值操作符不一样,你不定义,编译器不会自动合成.
所以你要是问子类赋值操作符会不会继承父类,那肯定是不会的.
1. 如果 子类没定义赋值操作符, 那么 子类会自动合成赋值操作符, 子类在赋值的时候会自动调用父类的赋值操作符来完成基类部分的复制拷贝.
2. 如果 子类自己定义了赋值操作符, 那么 子类就不会继续自动合成, 仍然子类必须手动调用父类的赋值操作符来完成基类部分的赋值拷贝,否则会造成部分复制( partial copy assignment )
但是你要问子类是否会继承 赋值重载运算符,那肯定会.
而且 赋值重载运算符 就和普通函数一样,能够呈现多态行为,
但是 赋值操作符不可能出现多态,因为它不可能是虚函数,虚函数要求函数的签名必须一样(除了返回值).
重载叫做overloading,他在C++中的意思是重新定义一个操作符的语义.
在①中,赋值操作符永远都和同类对象进行赋值拷贝,根本不存在重新定义一个新的语义.
而在②中,可以定义op=( int ), op=(double), op=(gadget),重新定义op=(),使得widget类分别和int, double, gadget对象的赋值有意义.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询