关于C++赋值运算符能不能继承问题

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;};//隐藏了父类的函数
};
上述的就可以实例化B类的对象了!

你可能感兴趣的:(C++基础)