gpt4 book ai didi

C++ 为什么我不能将基类分配给子类?

转载 作者:可可西里 更新时间:2023-11-01 18:02:15 25 4
gpt4 key购买 nike

我有这样的代码:

class Base
{
public:
void operator = (const Base& base_)
{
}
};

class Child : public Base
{
public:

};

void func()
{
const Base base;
Child child;
child = base;
}

我的问题是:既然 Child 派生自 Base(因此它应该继承 Base 的 operator= ),为什么当语句出现时

child = base;

被执行,我得到这样的编译器错误:

>.\main.cpp(78) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const Base' (or there is no acceptable conversion)
1> .\main.cpp(69): could be 'Child &Child::operator =(const Child &)'
1> while trying to match the argument list '(Child, const Base)'

我想要的行为是让 Child 类识别它被分配了一个 Base 类,并且只是“自动”调用其父类的 operator=。

一旦我将此代码添加到 Child 类中

void operator = (const Base& base_)
{
Base::operator=(base_);
}

然后一切都编译好了。虽然我不认为这会很好,因为如果我有 5 个继承自 Base 的不同类,那么我必须在每个派生类中重复相同的代码。

注意:我将 Base 复制到 Child 的目的是简单地复制 common 的成员BaseChild(这将是 Base 的所有成员)。即使在阅读了下面的所有答案之后,我真的不明白为什么 C++ 不允许这样做,尤其是当 Base 中定义了一个显式的 operator= 时> 类。

最佳答案

该标准在 12.8/10“复制类对象”(添加了重点)中提供了您的具体问题的原因:

Because a copy assignment operator is implicitly declared for a class if not declared by the user, a base class copy assignment operator is always hidden by the copy assignment operator of a derived class (13.5.3).

因此,当编译器为 Child::operator=() 执行名称查找/重载解析时,由于存在隐式声明的 operator=(const Child&)Base 类的函数签名从未被考虑过(它是隐藏的)。

关于C++ 为什么我不能将基类分配给子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241835/

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