C++父类与子类间构造,析构,拷贝的调用关系
构造
子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数
- 默认执行无参构造
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
class Base
{
char *str;
public:
Base(void)
{
cout << "父类无参构造" << endl;
}
Base(const char *str)
{
this->str = new char[strlen(str) + 1];
cout << "父类有参构造" << str << endl;
}
};
class A : public Base
{
public:
A(void)
{
cout << "子类无参构造" << endl;
}
A(const char *str)// : Base(str)
{
cout << "子类有参构造" << str << endl;
}
};
int main()
{
A a("h");
}
运行结果:
wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类无参构造
子类有参构造h
- 显式调用有参构造,在子类的构造函数后,初始化列表中显式调用父类的有参构造函数
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
class Base
{
char *str;
public:
Base(void)
{
cout << "父类无参构造" << endl;
}
Base(const char *str)
{
this->str = new char[strlen(str) + 1];
cout << "父类有参构造" << str << endl;
}
};
class A : public Base
{
public:
A(void)
{
cout << "子类无参构造" << endl;
}
A(const char *str) : Base(str)
{
cout << "子类有参构造" << str << endl;
}
};
int main()
{
A a("h");
}
运行结果
wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造h
子类有参构造h
析构
子类在它的析构函数执行完后,会根据继承表的顺序逆序执行父类的析构函数
- 注意: 父类的指针可以指向子类对象,当通过父类指针释放对象时,只会调用父类的析构函数,而这种析构方式有可能造成内存泄漏
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
class Base
{
char *str;
public:
Base(void)
{
cout << "父类无参构造" << endl;
}
Base(const char *str)
{
this->str = new char[strlen(str) + 1];
cout << "父类有参构造" << str << endl;
}
~Base(void)
{
cout << "父类析构" << endl;
}
};
class A : public Base
{
public:
A(void)
{
cout << "子类无参构造" << endl;
}
A(const char *str) : Base(str)
{
cout << "子类有参构造" << str << endl;
}
~A(void)
{
cout << "子类析构" << endl;
}
};
int main()
{
A *a = new A("xixi");
delete a;
cout << "----------------" << endl;
Base *b = new A("haha");
delete b;
}
运行结果
wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造xixi
子类有参构造xixi
子类析构
父类析构
----------------
父类有参构造haha
子类有参构造haha
父类析构
拷贝构造
当使用子类对象来初始化新的子类对象时,会自动调用缺省的拷贝构造函数,并且会先调用父类缺省的拷贝构造函数
- 如果子类中实现了拷贝构造,需要显式调用父类拷贝构造,否则就会调用无参构造
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
class Base
{
public:
char *str;
Base(void)
{
cout << "父类无参构造" << endl;
}
Base(const char *str)
{
this->str = new char[strlen(str) + 1];
cout << "父类有参构造" << str << endl;
}
Base(Base &that)
{
cout << "父类拷贝构造" << endl;
}
};
class A : public Base
{
public:
A(void)
{
cout << "子类无参构造" << endl;
}
A(const char *str) : Base(str)
{
cout << "子类有参构造" << str << endl;
}
A(A &that) : Base(that)
{
cout << "子类拷贝构造" << endl;
}
};
int main()
{
A a("x");
cout << "------" << endl;
A a1 = a;
cout << "------" << a.str << endl;
}
运行结果(子类中不重载拷贝构造)
wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造x
子类有参构造x
------
父类拷贝构造
------
运行结果(子类中重载拷贝构造但不显式调用父类拷贝构造)
wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造x
子类有参构造x
------
父类无参构造
子类拷贝构造
------
运行结果(子类中重载且显式调用父类拷贝构造)
wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造x
子类有参构造x
------
父类拷贝构造
子类拷贝构造
------