gpt4 book ai didi

c++ - 将基类对象分配给派生类对象

转载 作者:行者123 更新时间:2023-11-30 01:50:08 26 4
gpt4 key购买 nike

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

int main()
{
Base B;
Derived D;

Base B1 = D;//OK
Derived D1 = B;//error: conversion from ‘Base’ to non-scalar
//type ‘Derived’ requested
return 1;
}

我知道派生类与基类有 is-a 关系。

是什么阻止了 Derived D1 具有来自 B 的值和具有一些垃圾值的剩余成员变量(如果有)?

或者

错误信息是什么

conversion from ‘Base’ to non-scalar type ‘Derived’ requested Derived D1 = B;

说?什么是标量类型?

最佳答案

声明

Derived D1 = B;

是初始化,不是赋值(即使它看起来像赋值)。

它尝试使用 Derived复制构造函数,但该复制构造函数接受一个参数 Derived const& .和 B实例无法自动向下转换为完整的 Derived .

如果你真的想要切片分配——只分配给Base切片 D1 – 然后你可以显式地使用 Base::operator= :

Derived D1;
D1.Base::operator=( B );

另一种表达方式:

Derived D1;
static_cast<Base&>( D1 ) = B;

但是味道不好。 ;-)


回复

What is a scalar type?

这与“规模”中的词相同。标量类型提供单个幅度值,因此该类型的值可以与 == 进行比较(理想情况下也是 < )。然而,在 C++ 中,指针甚至成员指针都被视为标量类型:

C++11 §3.9/9 [基本类型]:

Arithmetic types (3.9.1), enumeration types, pointer types, pointer to member types (3.9.2), std::nullptr_t, and cv-qualified versions of these types (3.9.3) are collectively called scalar types.

关于c++ - 将基类对象分配给派生类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949748/

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