2015-09-19 62 views
3

我只是想了解它是如何发生的,因为它是新的C++。将对象初始化为另一个类的成员

让我详细说明我的问题陈述。

class test1 { 
public: 
    test1() { 
     cout << " test1::constructor called" << endl; 
    } 
    ~test1() { 
     cout << " test1::destrcutor called" << endl; 
    } 
}; 

class test2 { 
public: 
    test2() { 
     cout << " test2::constructor called" << endl; 
    } 
    ~test2() { 
     cout << " test2::destrcutor called" << endl; 
    } 
}; 

class derived :public test1, public test2 { 
    test2 t2; 
    test1 t1; 
public: 
    derived() { 
     cout << " derived constructor called" << endl; 
    } 
    ~derived() { 
     cout << "derived destructor called" << endl; 
    } 
}; 

int main() { 
    derived d; 
    return 0; 
} 

上述程序的输出显示

test1::constructor called 
    test2::constructor called 
    test2::constructor called 
    test1::constructor called 
    derived constructor called 
    derived destructor called 
    test1::destrcutor called 
    test2::destrcutor called 
    test2::destrcutor called 
    test1::destrcutor called 

所以在这里我的问题是,在什么点它叫做成员变量的构造函数在派生类中,因为我还没有把任何初始化为同。

+0

由于您是C++新手,因此使用继承和多态性时要注意的一件事是确保您从您派生的类正在使用虚拟析构函数,这将为您节省大量未来的麻烦!由于派生从test1和test2继承,所以test1和test2中的两个析构函数都应该是虚拟的!这可能不是必须的,但将派生析构函数虚拟为好也是一种好的做法!这有助于保持对象被销毁的顺序,以便类中的指针保持有效,特别是在处理动态或新内存时。 –

回答

8

施工的顺序是碱,则成员,以便: -

test1::constructor called << first base of 'derived' 
test2::constructor called << second base of 'derived' 
test2::constructor called << member of 'derived' t2 
test1::constructor called << member of 'derived' t1 
derived constructor called << code in 'derived::derived' 
derived destructor called << code in 'derived::~derived' 
test1::destrcutor called << destruction of t1 
test2::destrcutor called << destruction of t2 
test2::destrcutor called << destruction of derived 
test1::destrcutor called << destruction of derived 

只有一个对象的析构函数,它有一个限定以破坏对象。这是从班级的底部到顶部摧毁所有成员。

然后摧毁这个班级,并且它的基地处于“逆序”。

每个构造函数都可以选择要初始化的内容,而不是顺序。

a_class::a_class(params) : 
      base_n(params), base_n_1(params), 
      member_1(params), member_2(params),... 

member initialization list允许被赋予不同的参数来构建所有的基础和对象,但不影响秩序。它始终是first_basesecond_base,first_member, second_member,...

这个顺序是为了确保它与析构函数相反。

这些规则允许我确定哪些消息来自成员,哪些来自基地。

未从member initialization list初始化的成员仍将获得其默认构造函数test2::test2。因为一旦有一个构造函数,它们只会通过调用一个构造函数而成立。

Plain-old-DataPOD是简单的类型,如int没有构造函数。它们没有初始化(无论内存中的值是什么)。