c++ - operator= 和 C++ 中不继承的函数?

标签 c++ inheritance operator-overloading crtp

直到我刚刚做了一个测试,我才相信在 C++ 中只有构造函数是不被继承的。但显然,赋值 operator= 不太...

  1. 这是什么原因?
  2. 是否有任何解决方法来继承赋值运算符?
  3. operator+=, operator-=, ... 也是这样吗?
  4. 是否继承了所有其他函数(除了构造函数/operator=)?

事实上,我在做一些CRTP时遇到了这个问题:

template<class Crtp> class Base
{
    inline Crtp& operator=(const Base<Crtp>& rhs) {/*SOMETHING*/; return static_cast<Crtp&>(*this);}
};

class Derived1 : public Base<Derived1>
{
};

class Derived2 : public Base<Derived2>
{
};

有什么解决方案可以让它正常工作吗?

编辑:好的,我已经隔离了问题。为什么以下不起作用?如何解决问题?

#include <iostream>
#include <type_traits>

// Base class
template<template<typename, unsigned int> class CRTP, typename T, unsigned int N> class Base
{
    // Cast to base
    public:
        inline Base<CRTP, T, N>& operator()()
        {
            return *this;
        }

    // Operator =
    public:
        template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
        inline CRTP<T, N>& operator=(const T0& rhs)
        {
            for (unsigned int i = 0; i < N; ++i) {
                _data[i] = rhs;
            }
            return static_cast<CRTP<T, N>&>(*this);
        }

    // Data members
    protected:
        T _data[N];
};

// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
};

// Main
int main()
{
    Derived<double, 3> x;
    x() = 3; // <- This is OK
    x = 3;   // <- error: no match for 'operator=' in ' x=3 '
    return 0;
}

最佳答案

赋值运算符在技术上是继承的;但是,它总是被派生类的显式或隐式定义的赋值运算符隐藏(参见下面的注释)。

(13.5.3 Assignment) An assignment operator shall be implemented by a non-static member function with exactly one parameter. Because a copy assignment operator operator= is implicitly declared for a a class if not declared by the user, a base class assignment operator is always hidden by the copy assignment operator of the derived class.

您可以实现一个虚拟赋值运算符,它只是将调用转发给基类 operator=,如下所示:

// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
public:
    template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
    inline Derived& operator=(const T0& rhs)
    {
        return Base<Derived, T, N>::operator=(rhs);
    }
};

关于c++ - operator= 和 C++ 中不继承的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38328644/

相关文章:

c++ - Qt QNetworkAccessManager总是返回空数据,状态码为0

C++ 静态类的静态成员永远不会被引用。它肯定会被初始化还是可以从二进制文件中省略?

c++ - 带有 protected 字段的微妙 C++ 继承错误

inheritance - 如何在 Dart 中扩展 Rectangle 类?

c++ - 运算符重载的基本规则和惯用法是什么?

c++ - 用于 C++ 类变量的 OpenMP

c++ - 从具有行优先顺序的数组创建特征矩阵

java - 在 Java 中,List<Object> 与 List< 有何不同?扩展对象>?

c++ - 为什么operator->重载在VC2010中不起作用?

c++ - 在正确的全局运算符上推导出错误的成员运算符