C ++向下转换对象的奇怪行为

strange behavior of C++ downcasting on object

i 运行 下面的代码将对象的父部分分配给子对象。 但如内联所述,c 风格的向下转换表现出意想不到的行为。 那里发生了什么?请参考下面的评论。

    struct A {
    public:
        int i{};
        A() { std::cout<<"A constructor called\r\n"; }
        ~A() { std::cout<<"A destructor called\r\n"; }
    };

    struct B : public A {
        B() { std::cout<<"B constructor called\r\n"; }
        ~B() { std::cout<<"B destructor called\r\n"; }
    };

    A a{};
    B b{};
    a.i = 1;
    (A)b = a;  // this code no effect and surprisingly the destructor of A is called.
               // there was no compiler warning (g++ (Ubuntu 11.2.0-7ubuntu2) 11.2.0)
    std::cout<<a.i<<std::endl;
    std::cout<<b.i<<std::endl;
    A& ra = b;
    ra = a;     // A portion of B is initialized as expected
    std::cout<<b.i<<std::endl;

此代码打印为

调用了一个构造函数
一个名为
的构造函数 B 构造函数调用
一个名为 <-- 请注意这里
的析构函数 1
0
1
B 析构函数调用
一个名为
的析构函数 一个名为

的析构函数

魔法来了: (A)b = a;

发生的事情是:

  1. 调用 A 的复制构造函数并创建一个新的 [classA 对象]。它是一个临时对象,在这条语句之后它被销毁了。 所以打印 [一个名为 <-- 请注意这里]
  2. 的析构函数
  3. 在临时对象上调用 A 的 operator=。它只影响临时对象而不是原始对象 b;