首页 > 试题广场 >

请问实际运行结果是哪个?()

[单选题]
请问实际运行结果是哪个?()

#include<iostream>

class Base
{
public:
Base(const char* p_szName):m_szName(p_szName) {std::cout << m_szName << ",";}
virtual ~Base() { std::cout <<"~"<<m_szName << ", ";}
private:
const char* m_szName;
};

class Derived : public Base
{
public:
    Derived(const char*p_szName): m_szName(p_szName)
    ,m_objA((const char*)"A")
    ,m_objB((const char*)"B")
    ,Base((const char*)"C")
    {
        std::cout << m_szName << ",";
    }
    virtual ~Derived()
    {
        std::cout <<"~"<<m_szName << ",";
    }
private:
const char* m_szName;
Base m_objB;
Base m_objA;
};
int main()
{
    Base* p = new Derived("D");
    delete p;
    return 0;
}
	


  • B,A,C,D,~D,~C,~A,~B
  • C,B,A,D,~D,~A,~B,~C
  • C,A,B,D,~D,~B,~A,~C
  • A,B,C,D,~D,~C,~B,~A
两个考点:
1.构造函数的调用顺序是:基类》对象》派生类,析构顺序相反;
2.构造函数里初始化列表初始化顺序由成员变量的声明顺序决定。
所以选B
发表于 2017-08-11 15:06:23 回复(5)
 构造函数调用顺序:基类构造函数->子类成员变量构造函数->子类构造函数   
 析构函数调用顺序:子类析构函数->子类成员变量析构函数->基类析构函数  
组合派生类的构造函数构造顺序为:初始化基类成员->初始化新增对象成员->初始化新增非对象成员
同时组合派生类具有多个新增对象成员的时候,按照类中的声明顺序来初始化对象成员。
发表于 2018-09-19 11:10:10 回复(3)
两个考点: 1.构造函数的调用顺序是:基类》对象》派生类,析构顺序相反; 2.构造函数里初始化列表初始化顺序由成员变量的声明顺序决定。
发表于 2019-07-22 21:04:15 回复(0)
先构造基类部分,为什么不先输出"D"
发表于 2017-08-14 20:56:54 回复(13)
这道题唯一的难点在于 C与 B、A的位置,在初始化列表也就是子类实例化中,动态的调用的父类的有参构造函数,函数的调用远远比初始化父类的对象要快,所以是C->B->A->D
发表于 2022-02-28 19:55:10 回复(0)
派生类的构造函数是最后初始化的,初始化顺序是基类构造,派生类声明顺序(不是初始化列表中的顺序)m_szName首先被初始化但是它不会被输出,首先输出的事m_objB调用的是基类的有参构造函数,之后是m_objA,最后派生类的构造函数执行初始化,这里m_szName已经被初始化为了D,所以输出D。析构顺序正好相反,因为后被构造的对先被构造的有依赖关系,所以析构应该先析构后被构造的才不会出问题。
发表于 2022-02-17 23:29:17 回复(0)
1、构造虚基类(虚继承),只构造一次;
2、从上到下构造基类;
3、按照成员变量出现次序初始化;
4、构造函数;
发表于 2019-10-20 16:23:32 回复(0)
构造:基类构造函数->子类成员变量构造函数->子类构造函数 。(还要注意构造顺序和赋值表顺序无关,按照声明的顺序的,所以先base,再m_objB,m_objA,最后子类的m_szName)
析构:子类析构函数->子类成员变量析构函数->基类析构函数
发表于 2019-08-05 16:39:12 回复(0)
为什么不是先A在B
编辑于 2024-01-06 15:38:36 回复(1)
 构造:基类构造函数->子类成员变量构造函数->子类构造函数 。(还要注意构造顺序和赋值表顺序无关,按照声明的顺序的,所以先base,再m_objB,m_objA,最后子类的m_szName) 
 
  析构:子类析构函数->子类成员变量析构函数->基类析构函数
发表于 2023-06-14 10:46:48 回复(0)
为什么是 C 首先初始化呢?求解答,谢谢!
发表于 2021-11-16 10:51:32 回复(1)
#include <iostream>

class Base
{
public:
    Base(const char *p_szName):m_szName(p_szName)
    {
        std::cout << m_szName << ",";
    }

    virtual ~Base()
    {
        std::cout << "~" << m_szName << ",";
    }

private:
    const char *m_szName;
};

class Derived: public Base
{
public:
    Derived(const char *p_szName): m_szName(p_szName),
    m_objA((const char*)"A"),
    m_objB((const char*)"B"),
    Base((const char*)"C")
    {
        std::cout << m_szName << ",";
    }

    virtual ~Derived()
    {
        std::cout << "~" << m_szName << ",";
    }

private:
    const char *m_szName;
    Base m_objB;
    Base m_objA;
};

int main()
{
    Base* p = new Derived("D");
    delete p;
    return 0;
}

发表于 2020-12-29 14:50:49 回复(0)

构造函数中,构造顺序和初始化列表顺序无关

发表于 2019-08-08 10:58:12 回复(0)
为啥是先声明B啊?求大神指点
发表于 2019-03-13 10:56:46 回复(2)