[英]C++ casting derived class to base type and back to derived
我有一个想要扩展(添加另一个变量)的旧类A,但是由于此代码已经在生产中,因此向面向用户的类添加变量将破坏二进制兼容性。 我尝试使用一些强制转换使其工作,但遇到了一些问题。
#include <iostream>
#include <chrono>
#include <thread>
#include <cassert>
using std::cout;
using std::endl;
class A {
public:
int a;
A() {
cout<<"A Constructed"<<endl;
}
~A() {
cout<<"A Destructed"<<endl;
}
};
class B : public A {
public:
int b;
B() {
cout<<"B Constructed"<<endl;
b = 10;
}
};
int main()
{
B obj1;
A obj2 = obj1;
cout << "value is " << ((B*)&obj2)->b << endl;
}
我期望该值是10,因为我在B的构造函数中设置了该值,但实际上我得到了0。有没有办法将其固定为10。
Output:-
./a.out
A Constructed
B Constructed
value is 0
A Destructed
A Destructed
初始化
B obj1;
A obj2 = obj1;
…复制构造obj2
,并将对B
对象的引用传递给该构造函数。 在构造函数内部,它被视为(仅)一个A
对象。 这称为切片 。
如果在整个代码中将A
对象视为值对象,则除非可以修改类A
否则不能直接在其中添加状态。
修正这条线
A obj2 = obj1;
成为
A &obj2 = obj1;
因为使用您的原始代码会调用默认的复制构造函数A::A(const A& other)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.