C++的赋值运算符是可以被继承的。
有的人说不能被继承,“赋值运算符重载函数”不是不能被派生类继承,而是被派生类的默认“赋值运算符重载函数”给隐藏了。
条款45: 弄清C++在幕后为你所写、所调用的函数
一个空类什么时候不是空类? ---- 当C++编译器通过它的时候。如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:
class Empty{};
和你这么写是一样的:class Empty {
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数
~Empty(); // 析构函数 ---- 是否
// 为虚函数看下文说明
Empty&
operator=(const Empty& rhs); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const;
};
所以: class A
{
public:
A& operator=(int a);
};
class B:public A
{
//这里隐藏了一个默认提供的 B& operator=(const B& b); 将父类的那个给隐藏了
};
int main(int argc, char *argv[])
{
A a = 10;//allow
B b = 10;//Not allow
}
现在说说隐藏和重写的区别:重写是对基类的virtual函数的重新定义,要求形参列表必须相同!而隐藏则是在子类里面有跟基类函数名字一样的函数,注意这个函数不为virtual。
看看一个例子:
class A
{
public:
virtual int test()=0{};
};
class B:public A
{
int test(int a){return 0;};
};
这里用B类去实例化一个对象出错,因为B是抽象类,B类的test函数并不是对A类的重写,而是隐藏!对于父类给的virtual函数,子类必须全部实现重写,否则将会完全复制下来!上面代码其实相当于:class A
{
public:
virtual int test()=0{};
};
class B:public A
{
virtual int test()=0{};
int test(int a){return 0;};
};
而像这样:class A{
public:
virtual int test()=0{};
};
class B:public A
{
int test(){return 0;};//重写
int test(int a){return 0;};//隐藏了父类的函数
};</span>
上述的就可以实例化B类的对象了! 版权声明:本文为u010177010原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。