将基类对象分配给一个已解决的类

Pur*_*tam 2 c++ oop

考虑我正在创建两个类的对象:

BaseClass B;
DerievedClass D;
Run Code Online (Sandbox Code Playgroud)

然后我在做:

B=D;
D=B;
Run Code Online (Sandbox Code Playgroud)

这是合法的,为什么.这是一个C++相关工作的面试官提出的问题.我知道大多数是B = D; 将是有效的(对象切片); 但它是这样D = B; 只有在B有默认构造函数时才有效?是的,那为什么呢?

Naw*_*waz 6

B=D;
D=B;
Run Code Online (Sandbox Code Playgroud)

第一行将始终编译.第二行可能编译也可能不编译,因为它完全取决于你如何编写每个类.答案的其余部分将阐明它.继续阅读.


这是D = B; 只有在B有默认构造函数时才有效?

没有.

D=B仅在D定义了operator=哪个B作为参数时才有效.

Derived & operator=(const Base &base); //member of Derived

Base B;
Derived D;
D = B;     //allowed - assignment
Run Code Online (Sandbox Code Playgroud)

或者,如果你这样做,在初始化D,那么它会有效仅当一个构造函数D需要B作为参数.

Derived(const Base &base); //a constructor of Derived

Base B;
Derived D = B; //allowed - initialization
Run Code Online (Sandbox Code Playgroud)

B已定义用户定义的转换D.

operator Derived(); //member of Base

Base B;
Derived D = B; //allowed      - initialization
D = B;         //also allowed - assignment
Run Code Online (Sandbox Code Playgroud)