C ++将派生类转换为基类型并返回派生类

时间:2016-07-23 00:46:18

标签: c++

我有一个遗留类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

2 个答案:

答案 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)

相关问题