派生类中的C++赋值运算符
C++ assignment operator in derived class
我不太明白为什么对于赋值,派生类不调用基类的相应运算符,如果它自己的运算符不存在的话。看看代码:
#include <iostream>
using namespace std;
class A{
protected:
void myWrite(){
cout << " Base " <<endl;
}
public:
double x,y;
A(): x{0},y{0}{};
virtual A & operator=(double g){x=g;y=g;return *this;}
virtual ~A(){};
virtual void doneit(){myWrite();}
};
class B: public A{
protected:
public:
B():A(){};
virtual ~B(){};
virtual void doneit(){myWrite();}
};
int main() {
A jj;
B pp;
pp=0.0;
return 0;
}
事实上,代码不会编译。当然,如果我为B定义了一个与A相同的"operator=",一切都可以,但如果派生类中的那个没有定义,为什么默认情况下不调用B"operator+"??你能帮我澄清一下这个问题吗?
gcc编译器说/src/tito.cpp:40:4:错误:没有可行的重载'='pp=0.0;~~^~~~../src/tito.cpp:28:7:注意:候选函数(隐式复制赋值运算符)不可行:第一个参数没有从"double"到"const B"的已知转换乙类:公共甲类{^生成1个错误。
你能解释一下为什么它不起作用吗?
如果不声明复制赋值运算符,编译器将为您声明一个。所以你的类B
真的看起来像:
class B : public A {
public:
// explicit
B();
virtual ~B();
virtual void doneit();
// implicit
B(const B&);
B& operator=(const B&);
};
隐式复制赋值运算符隐藏了您编写的A::operator=(double)
,因此它是名称查找将找到的唯一候选者。当然,它不是一个可行的候选者,因为double
不能转换为B
,因此出现了错误。
要使用A::operator=(double )
运算符,必须明确地将其纳入范围:
using A::operator=;
但是,您不会分配任何B
部分。所以最好更明确一点:
B& operator=(double g) {
// B stuff here
// A stuff
A::operator=(g);
return *this;
}
class B: public A{
protected:
public:
using A::operator =;
B():A(){};
virtual ~B(){};
virtual void doneit(){myWrite();}
};
另一种方法是在派生类中重新声明虚拟赋值运算符
B & operator=(double g) { A::operator =( g ) ;return *this;}
在这种情况下,您可以使用多态性。例如
#include <iostream>
class A
{
public:
double x,y;
A(): x{0}, y{0} {}
virtual A & operator =( double g ){ x = g; y = g; return *this; }
virtual ~A(){}
};
class B: public A
{
public:
B() : A(){}
virtual B & operator =( double g ) override { A::operator =( 2 * g ) ; return *this; }
virtual ~B(){}
};
int main()
{
A a;
B b;
A *p = &a;
*p = 10;
std::cout << p->x << ' ' << p->y << std::endl;
p = &b;
*p = 10;
std::cout << p->x << ' ' << p->y << std::endl;
return 0;
}
程序输出为
10 10
20 20
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 为什么初始化时没有调用重载赋值运算符?
- 赋值运算符重载和自赋值
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对 r 值使用移动赋值运算符时的异常
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 默认赋值运算符如何在实际 STL 中实现
- 使用赋值运算符复制 std::vector
- C++ 通过自定义赋值运算符隐式转换函数参数
- 赋值运算符的奇怪行为
- C++赋值运算符,我们可以用 copy 替换它吗?