300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > C++派生类与基类构造函数调用次序

C++派生类与基类构造函数调用次序

时间:2019-06-18 13:40:27

相关推荐

C++派生类与基类构造函数调用次序

本文用来测试C++基类和派生类构造函数,析构函数,和拷贝构造函数的调用次序。

运行环境:SUSE Linux Enterprise Server 11 SP2 (x86_64)

#include <iostream>

using namespace std;

class Base

{

public:

Base()

{

cout << "Base Constructor" << std::endl;

}

Base(const Base& other)

{

cout << "Base Copy Constructor" << std::endl;

}

virtual ~Base()

{

cout << "Base Destructor" << std::endl;

}

const Base & operator = (const Base& other)

{

cout << "assignment operator" << std::endl;

}

};

class Derived: public Base

{

public:

Derived()

{

cout << "Derived Constructor" << std::endl;

}

Derived(const Derived& other)

{

cout << "Derived Copy Constructor" << std::endl;

}

virtual ~Derived()

{

cout << "Derived Destructor" << std::endl;

}

const Derived & operator = (const Derived& other)

{

cout << "assignment operator" << std::endl;

}

};

==============================================================

A. 测试派生类对象

int main(int argc, char *argv[])

{

Derived d1;

return 1;

}

输出:

Base Constructor

Derived Constructor

Derived Destructor

Base Destructor

结论:

1.先构造父类,才构造子类,没有父亲,哪有儿子啊!

2.即使子类(派生类)没有显式(explicit)的调用(在初始化列表中调用)父类(基类)的构造函数,父类的构造函数也会被调用;

================================================================

B. 测试基类的拷贝构造函数

int main(int argc, char *argv[])

{

Base b1;

cout << "b1 constructed done" << std::endl;

Base b2 = b1;

cout << "b2 constructed done" << std::endl;

Base b3(b2);

cout << "b3 constructed done" << std::endl;

return 1;

}

输出结果:

Base Constructor

b1 constructed done

Base Copy Constructor

b2 constructed done

Base Copy Constructor

b3 constructed done

Base Destructor

Base Destructor

Base Destructor

结论:

1. 代码: "Base b2 = b1;" 和 "Base b3(b2);"

将调用拷贝构造函数,而不是其它的(赋值、构造)函数;

扩展: 函数参数传值调用也会调用拷贝构造函数

添加函数:

void Func(Base b)

{

}

int main(int argc, char *argv[])

{

Base b1;

cout << "b1 constructed done" << std::endl;

Func(b1);

return 1;

}

输出结果:

Base Constructor

b1 constructed done

Base Copy Constructor

Base Destructor

Base Destructor

可见: 函数参数传值调用也会调用拷贝构造函数

==================================================================

C. 测试派生类的拷贝构造函数

int main(int argc, char *argv[])

{

Derived b1;

cout << "b1 constructed done" << std::endl;

Derived b2 = b1;

cout << "b2 constructed done" << std::endl;

Derived b3(b2);

cout << "b3 constructed done" << std::endl;

return 1;

}

输出结果:

Base Constructor

Derived Constructor

b1 constructed done

Base Constructor

Derived Copy Constructor

b2 constructed done

Base Constructor

Derived Copy Constructor

b3 constructed done

Derived Destructor

Base Destructor

Derived Destructor

Base Destructor

Derived Destructor

Base Destructor

结论:

1. 派生类的拷贝构造函数被调用前,会调用子类的构造函数;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。