将基础 class 对象分配给派生 class 对象
Assigning base class object to derived class object
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;
}
我知道派生 class 与基础 class 有一种关系。
是什么阻止派生 D1 具有来自 B 的值和具有一些垃圾值的剩余成员变量(如果有)?
或者
错误信息是什么
conversion from ‘Base’ to non-scalar type ‘Derived’ requested Derived D1 = B;
说?什么是标量类型?
如果 B
的成员变量被声明为私有,那么 D1
将无法拥有 B
的值。
至于你的第二个问题,你可以分配 Base B1 = D;
因为编译器知道 D
是从 B
派生的 class。但是,在 Derived D1 = B;
中,编译器没有指示这种关系。
关于什么是标量的问题,标量是整数、字符、指针等。它们不同于结构和 classes,后者是用户定义的类型。
声明
Derived D1 = B;
是初始化,不是赋值(即使看起来像赋值)。
它尝试使用 Derived
复制构造函数,但该复制构造函数采用参数 Derived const&
。 B
实例无法自动向下转换为完整的 Derived
.
如果你真的想要一个切片分配——只分配给 D1
的 Base
切片——那么你可以明确地使用 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 [basic.types]:
” 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.
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;
}
我知道派生 class 与基础 class 有一种关系。
是什么阻止派生 D1 具有来自 B 的值和具有一些垃圾值的剩余成员变量(如果有)?
或者
错误信息是什么
conversion from ‘Base’ to non-scalar type ‘Derived’ requested Derived D1 = B;
说?什么是标量类型?
如果 B
的成员变量被声明为私有,那么 D1
将无法拥有 B
的值。
至于你的第二个问题,你可以分配 Base B1 = D;
因为编译器知道 D
是从 B
派生的 class。但是,在 Derived D1 = B;
中,编译器没有指示这种关系。
关于什么是标量的问题,标量是整数、字符、指针等。它们不同于结构和 classes,后者是用户定义的类型。
声明
Derived D1 = B;
是初始化,不是赋值(即使看起来像赋值)。
它尝试使用 Derived
复制构造函数,但该复制构造函数采用参数 Derived const&
。 B
实例无法自动向下转换为完整的 Derived
.
如果你真的想要一个切片分配——只分配给 D1
的 Base
切片——那么你可以明确地使用 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 [basic.types]:
” 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.