gpt4 book ai didi

c++ - 在 [over.ass]/2 中的示例中,为什么 *bptr = dobj2;调用 D::operator=(const B&)?

转载 作者:行者123 更新时间:2023-11-30 03:24:11 24 4
gpt4 key购买 nike

[over.ass]/2

我可以理解为什么 bptr->operator=(dobj2); 调用 D& operator= (const B&) 以及为什么 dobj1 = dobj2; 调用隐式声明的 D::operator=(const D&)。但我不太确定 *bptr = dobj2;

例子:

struct B {
virtual int operator= (int);
virtual B& operator= (const B&);
};
struct D : B {
virtual int operator= (int);
virtual D& operator= (const B&);
};

D dobj1;
D dobj2;
B* bptr = &dobj1;
void f() {
bptr->operator=(99); // calls D::operator=(int)
*bptr = 99; // ditto
bptr->operator=(dobj2); // calls D::operator=(const B&)
*bptr = dobj2; // ditto
dobj1 = dobj2; // calls implicitly-declared D::operator=(const D&)
}

最佳答案

多态性发生在你有一个 Base 指针或对派生实例的引用并在其上调用虚拟成员函数时。

在你的例子中

bptr->operator=(99); // calls D::operator=(int)
bptr->operator=(dobj2); // calls D::operator=(const B&)

指向派生实例的基指针正在调用虚函数 => 调用多态性 => 将调用派生版本。

*bptr = 99; // ditto
*bptr = dobj2; // ditto

这简直了

(*bptr).operator=(99);
(*bptr).operator=(dobj2);

或者对派生实例的基引用正在调用虚函数 => 调用多态性 => 将调用派生版本。

dobj1 = dobj2; // calls implicitly-declared D::operator=(const D&)

不再有多态性,因为调用者 (dobj1) 不是(基础)引用/指针。调用了编译器生成的D::operator=(const D&),也调用了基类的运算符 = 自动。

virtual B& operator= (const B&);

关于c++ - 在 [over.ass]/2 中的示例中,为什么 *bptr = dobj2;调用 D::operator=(const B&)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866526/

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