我有一个遗留类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&#39的构造函数中设置它,但实际上我得到0.有没有办法解决这个问题得到10。
Output:-
./a.out
A Constructed
B Constructed
value is 0
A Destructed
A Destructed
答案 0 :(得分:3)
初始化
B obj1;
A obj2 = obj1;
...复制构造obj2
,并引用传递给该构造函数的B
对象。在构造函数内部,它被视为(仅)A
对象。这称为切片。
如果A
个对象在整个代码中被视为值对象,那么除非可以修改类A
,否则不能直接在其中添加状态。
答案 1 :(得分:0)
修正此行
A obj2 = obj1;
是
A &obj2 = obj1;
因为您使用原始代码调用默认复制构造函数A::A(const A& other)