gpt4 book ai didi

c++ - 在派生类实例之间使用基类中定义的运算符

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:08 24 4
gpt4 key购买 nike

我有两个类,Base 和 Derived。 Base 定义了一个运算符(此处为运算符 +),我想在派生类的实例之间使用它,但我无法解决这个问题。

这里有一些解释问题的最小代码:

class Base{
public:
Base(int X){ x = X; }

Base operator+(const Base& rhs){
return Base(x + rhs.x);
}

int x;
};

class Derived : public Base{
public:
using Base::Base;
};

int main(){
Derived der1(0);
Derived der2(0);

Derived der3 = der1 + der2;

return 0;
}

编译器说:

main.cpp: In function ‘int main()’:
main.cpp:21:23: error: conversion from ‘Base’ to non-scalar type ‘Derived’ requested
Derived der3 = der1 + der2;

Derived 类除了从 Base 继承的属性之外不需要任何属性。

谢谢!

最佳答案

这是反复出现的模板模式的常见用例。一个例子是

template<typename T>
class Base
{
public:
Base(int X) { x = X; }

friend T operator+(const Base& lhs, const Base& rhs)
{
return T(lhs.x + rhs.x);
}

int x;
};

class Derived : public Base<Derived>
{
public:
Derived(int arg) : Base(arg) { }
using Base::Base;
};

int main()
{
Derived der1(1);
Derived der2(2);

Derived der3 = der1 + der2;

return 0;
}

这会表现得像 so .

好友名称注入(inject)(或 Barton Nackman 技巧)用于在实例化模板类型时生成函数。以上是设计的粗略草图,但我应该引导您完成调用 + 运算符的过程。

  1. der1der2 被转换为对基类的引用
  2. base 的运算符 + 的主体被选中(即使它在不同的命名空间中,参数相关的查找也会开始,我们会有解决方案)
  3. 运算符构造了一个T,在本例中,它的类型是Derived out of the sum

    (lhs.x + rhs.x)
  4. 该对象用于初始化der3

关于c++ - 在派生类实例之间使用基类中定义的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com