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