析构函数在 C++ 中被调用两次
Destructor called two times in C++
我有一个包含两个 class 的代码,如下所示:
Class答:
class A {
int a, b;
public:
A(int x, int y) {
a = x;
b = y;
}
~A() {
cout << "Exit from A\n";
}
void values() {
cout << a << "\n" << b << endl;
}
};
Class乙:
class B :public A
{
int c;
public:
B(int x, int y, int z) :A(x, y)
{
c = z;
}
~B() {
cout << "Exit from B\n";
}
void values() {
A::values();
cout << c << endl;
}
};
主要功能:
int main()
{
A testA(1, 2);
testA.values();
B testB(10, 20, 30);
testB.values();
}
这就是我得到的:
1
2
10
20
30
Exit from B
Exit from A
Exit from A
首先从 class B 调用析构函数,然后从 A 调用两次。为什么是两次?不知道怎么改。
在 main
、testA
和 testB
的 A
基础子对象中创建了 2 个 A
对象。两者都在 main 的末尾被销毁,顺序与它们的声明顺序相反。
class A {
int a, b;
std::string msg;
protected:
A(int x, int y, std::string m) : a(x), b(y), msg(m) {}
public:
A(int x, int y) : A(x, y, "Exit from A\n") {}
virtual ~A() {
std::cout << msg;
}
virtual void values() {
std::cout << a << "\n" << b << std::endl;
}
};
class B :public A
{
int c;
public:
B(int x, int y, int z) : A(x, y, "Exit from B\n"), c(z) {}
void values() override {
A::values();
std::cout << c << std::endl;
}
};
您有对象 testA
,它将从 A
(1) 调用它的析构函数。
您有从 A
派生的对象 testB
,因此它将调用析构函数 B
(1) 和析构函数 A
(2).
这正是您的输出内容。
我有一个包含两个 class 的代码,如下所示:
Class答:
class A {
int a, b;
public:
A(int x, int y) {
a = x;
b = y;
}
~A() {
cout << "Exit from A\n";
}
void values() {
cout << a << "\n" << b << endl;
}
};
Class乙:
class B :public A
{
int c;
public:
B(int x, int y, int z) :A(x, y)
{
c = z;
}
~B() {
cout << "Exit from B\n";
}
void values() {
A::values();
cout << c << endl;
}
};
主要功能:
int main()
{
A testA(1, 2);
testA.values();
B testB(10, 20, 30);
testB.values();
}
这就是我得到的:
1
2
10
20
30
Exit from B
Exit from A
Exit from A
首先从 class B 调用析构函数,然后从 A 调用两次。为什么是两次?不知道怎么改。
在 main
、testA
和 testB
的 A
基础子对象中创建了 2 个 A
对象。两者都在 main 的末尾被销毁,顺序与它们的声明顺序相反。
class A {
int a, b;
std::string msg;
protected:
A(int x, int y, std::string m) : a(x), b(y), msg(m) {}
public:
A(int x, int y) : A(x, y, "Exit from A\n") {}
virtual ~A() {
std::cout << msg;
}
virtual void values() {
std::cout << a << "\n" << b << std::endl;
}
};
class B :public A
{
int c;
public:
B(int x, int y, int z) : A(x, y, "Exit from B\n"), c(z) {}
void values() override {
A::values();
std::cout << c << std::endl;
}
};
您有对象 testA
,它将从 A
(1) 调用它的析构函数。
您有从 A
派生的对象 testB
,因此它将调用析构函数 B
(1) 和析构函数 A
(2).
这正是您的输出内容。