繁体   English   中英

C ++将派生类转换为基本类型,然后再返回派生

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM