首页 > 试题广场 >

知识点:CC++ 510(单选) 下面这段程序,正确的输

[不定项选择题]
#include <iostream>
using namespace std;
struct A{
    A(){cout<<"A::A"<<endl;}
    ~A(){cout<<"A::~A"<<endl;}
};

struct B:public A{
    B(){cout<<"B::B"<<endl;}
    ~B(){cout<<"B::~B"<<endl;}
};

int main(){
    A* a= new B;
    delete a;
}

  • A::A
    B::B
    B::~B
    A::~A
  • A::A
    B::B
    A::~A
    B::~B
  • A::A
    B::B
    A::~A
  • A::A
    B::B
    B::~B
<p>基类中的析构函数没有加virtual,变成虚析构,应此不调用子类的析构函数</p>
发表于 2020-08-07 21:02:52 回复(4)

首先new运算符会调用B的构造函数,而在B的构造函数中又会调用A的构造函数(在所有的用户代码之前):

 B() {
     // C++伪码
     A::A();    // 在所有用户代码之前执行
     cout<<"B::B"<<endl; 
 }

因此会输出A::A,B::B

然后执行delete,由于A的析构函数不是virtual的,并且a是一个类型A的指针,所以只会调用A的析构函数而不是B的析构函数,结果输出A::~A。析构函数会以构造的相反顺序来执行:

// 若~A()加上了virtual
~A() {
    // C++伪码
    B::~B();    // 在所有用户代码之前执行
    cout<<"A::A"<<endl;
}

上面构造函数和析构函数的调用都是由编译器自动为我们插入的代码,无需手动执行

如果~A()不加上virtual关键字,那么A的对象中是不存在vptr的(虚函数指针),也就没有多态性,那么delete a会在编译期间被决议为对类型A的指针a进行操作,而不是在运行期间对指针a所指的真实对象进行操作,那么也就无法调用B的析构函数了

因此,若一个类继承自一个基类,而这个基类定义了析构函数,为了能够正确地调用派生类的析构函数,基类的析构函数最好加上virtual

发表于 2022-02-22 10:31:04 回复(0)
hzh头像 hzh
1.2.
编辑于 2021-07-22 10:41:28 回复(0)

与之前理解有出入,但实际运行结果确实如此:
图片说明

发表于 2021-04-01 21:25:53 回复(2)
构造函数执行顺序:先父类再子类所以是A::A,B::B

由于delete的是A的指针,所以只会回收A的内存,想要回收B的内存需要将A的析构函数定义为虚函数
发表于 2022-04-21 23:47:40 回复(0)
A* a= new B;这是一个向上强制转型,即将派生类隐式转换为基类;
由于基类的析构函数不是虚函数,故指针a选择方法的方式就是指针对象类型的方法,
delete a调用的就是A类的析构函数;
如果基类析构函数是虚函数,指针a选择方法的方式就是指针对象指向的类型的方法。
故C
发表于 2022-08-09 09:51:24 回复(0)
通过父类对象的指针(指向子类对象)删除时,如果父类的析构函数不是虚函数,则不会掉用子类的析构函数;一般父类的析构函数定义为虚函数,那么子类的也为虚,删除时会掉用子类
发表于 2023-01-28 16:10:58 回复(0)
改题为多选题 正确答案 C 你的答案:AC
发表于 2022-09-02 16:37:28 回复(0)
如果A的析构函数变为:
virtual ~A(){cout<<"A::~A"<<endl;}

那么输出为:
A::A
B::B
B::~B
A::~A


发表于 2022-03-03 19:23:31 回复(1)
父类指针指向子类对象,典型的多态。
之前还以为只会调用子类的构造和析构呢,涨知识了
发表于 2023-06-27 17:52:29 回复(0)
请问C语言可以这样写吗?
发表于 2023-04-09 17:18:05 回复(0)
直接访问只能访问到自己的成员。但是可以通过指针来访问纯虚列表,从而来访问指向的子类的成员。 所以加个virtual ,实现多态,基类指针才能访问到派生类的析构函数。 ~我是这样理解的
发表于 2021-04-28 00:02:24 回复(0)
难到main()结束之后不会释放B吗?
发表于 2021-02-26 17:23:47 回复(1)