C++ 继承和赋值运算符
Posted
技术标签:
【中文标题】C++ 继承和赋值运算符【英文标题】:C++ inheritance and assignment operator 【发布时间】:2021-06-07 07:39:59 【问题描述】:我正在使用 CRTP 来实现 C++ 功能。
现在我遇到了这样的情况。
template<typename T>
struct A
char a;
T operator+(const T& other)
T t;
t.a = a + other.a;
return t;
;
struct B : A<B>
;
struct C : B
C& operator=(const C& other)
a = other.a;
return *this;
;
int main()
C c1,c2,c3;
c3 = c1 + c2;
return 0;
这段代码编译不上no viable overloaded=
如何在不向struct A
和struct B
添加任何代码的情况下解决此问题?
【问题讨论】:
【参考方案1】:您需要创建以B
为参考的赋值运算符:
struct C : B
C& operator=(const C& other)
return *this = static_cast<const B&>(other);
C& operator=(const B& other)
a = other.a;
return *this;
;
简短的解释为什么你需要这个(我希望我没有错):
+ operator
返回一个B
引用,因为B
是模板参数,而不是C
。所以忽略+
会有一个分配C = B
这是不可能的。需要明确的是,您不需要第一个赋值运算符来运行您的代码。
也许这也更清楚更好:
struct C : B
B& operator=(const B& other)
a = other.a;
return *this;
;
现在您的赋值运算符将B
作为输入和输出。
【讨论】:
你是对的,我会接受这个答案【参考方案2】:您还可以为C class
重载operator+
以允许c1 + c2
代码返回C
对象而不是B
object(由于@987654326,它目前确实如此@ 在B
类中定义)。通过这种方式,您可以获得一个 C
对象,作为 c1+c2
的结果,可以使用类 C
中定义的 operator=
进行分配。
例如,将此函数添加到C class
,如下所示:
C& operator+(const C& other)
// for example add the two operands' characters
this->a += other.a;
return *this;
请注意您选择背后的想法,因为它可能会编译但不会执行您希望它执行的操作。
重载+
或=
可能取决于您希望对代码执行的操作以及您希望从操作c1+c2
获得的类型。
【讨论】:
以上是关于C++ 继承和赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章
C++ 继承多态关系中的赋值运算符的重载=operator()
C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承