c++, 派生类的构造函数和析构函数

1.构造函数与析构函数不会被继承;[1]

  不是所有的函数都能自动地从基类继承到派生类中的。构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么。所以,在整个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承。
  另外,operator= 也不能被继承,因为它完成类似于构造函数的活动。

2.派生类的构函数被调用时,会先调用基类的其中一个构造函数,因为在派生类的构造函数中用了初始化表的方式调用了基类构造函数,默认不写时是调用了基类中可以不传参数的构造函数。

3.在派生类对象释放时,先执行派生类析构函,再执行其基类析构函数。

#include <iostream>
using namespace std;
#include <string>

class Basic
{
public:
    string m_name;
    Basic();
    Basic(string name);
    Basic(Basic& bc);

    ~Basic();

    Basic& operator=(const Basic& bc)
    {
        cout << "Basic::operator=()\n";
        this->m_name = bc.m_name;
        return *this;
    }
};
Basic::Basic()
{
    cout <<"Basic::Basic()"<<endl;
}
Basic::Basic(string name)
{
    m_name = name ;
    cout <<"Basic::Basic(string)"<<"name:"<<m_name<<endl;
}
Basic::Basic(Basic &bc)
{
    this->m_name = bc.m_name;
    cout <<"Basic::Basic(Basic&)"<<"name:"<<bc.m_name<<endl;
}

Basic::~Basic()
{
    cout<<"this is "<<m_name << "Basic::~Basic()"<<endl;;
}

class Derived:public Basic
{
public:
    int m_dx;
    Derived();
    Derived(string name);//m_name
    ~Derived();

    void show();
};
Derived::Derived()
{
    cout <<"Derived::Derived()"<<endl;
}
Derived::Derived(string name)
    :Basic(name)
{
    cout <<"Derived::Derived(string)"<<"name:"<<m_name<<endl;
}
Derived::~Derived()
{
    cout <<"this is "<<m_name <<"Derived::~Derived()"<<endl;;
}
void Derived::show()
{
    cout<<"name: "<<m_name<<endl;
}
void test()
{
    Derived dc1("dc1");
    cout<<""<<endl;

    Derived dc2("dc2");//m_bx
    cout<<""<<endl;

    dc1 = dc2 ;
    cout<<"next is dc1.show():  ";
    dc1.show();
    cout<<""<<endl;
}
int main() {
    test();
    while(1);
}
/**
Basic::Basic(string)name:dc1
Derived::Derived(string)name:dc1

Basic::Basic(string)name:dc2      //生成派生类对象时,先调用基类的构造函数
Derived::Derived(string)name:dc2  //在调用自身的构造函数

Basic::operator=()  //调用了基类的operator= ,并正确地对Derived::m_name进行了赋值。             //测试时,假如把基类的operator=实现为空函数,那么Derived对象也不能对Derived::m_name进行重新赋值。除非再手动实现Derived的operator=。            //operator= 只有一个,Drived中如果手动实现了,将会覆盖基类的=。就是说,不会执行基类的operator=。
next is dc1.show(): name: dc2 this is dc2Derived::~Derived() //析构和构造的调用顺序刚好相反。先调用自身的析构函数,再调用基类的析构函数。 this is dc2Basic::~Basic() this is dc2Derived::~Derived()//在一个函数体中,先实现的对象后释放。 this is dc2Basic::~Basic() **/

4.派生类构造函数首行的写法:

class Basic
{
public:
    int m_number;
    string m_name ;
    char m_sex;//‘m‘ ‘w‘
    Basic(int n ,string name , char s);
};
Basic::Basic(int n,string name ,char s)
    :m_number(n)
    ,m_name(name)
    ,m_sex(s)
{
//     this->m_name = name;
//     this->m_number = n;
//     this->m_sex = s;
}

class Derived:public Basic
{
public:
    int m_age;
    string m_addr;
    Derived(int n,string name,char s,int a, string addr);
};
Derived::Derived(int n,string name,char s,int a, string addr)
    :Basic(n,name,s)
    ,m_age(a)
    ,m_addr(addr)
{

}

参考:

1.构造与析构函数与 operator=不能被继承
  http://www.cnblogs.com/findumars/p/3695340.html

时间: 2024-11-07 19:35:06

c++, 派生类的构造函数和析构函数的相关文章

对C++中派生类的构造函数和析构函数的认识

一:构造函数 形式:派生类名::派生类名:基类名1(参数1),基类名2(参数2),--基类名n(参数n),数据成员1(参数1),数据成员2(参数2),--数据成员n(参数n){ 各种操作的说明 } 执行过程:先执行基类的构造函数,再进行数据成员的赋值,最后执行函数体. 其中基类名和数据成员的顺序是由在派生类的定义中声明的顺序决定执行的顺序的,因此它们的顺序是任意的,但为了可读性,还是最好按顺序写. 如果基类只有默认构造函数,则基类名和参数表可以不用写出来. 二:复制构造函数 派生类的构造函数的形

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

C++基类和派生类的构造函数和析构函数的调用

C++基类和派生类的构造函数和析构函数的调用 1.调用顺序 当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象.当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数. 所以,构造函数:基类->派生类:析构函数:派生类->基类. 示例: 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 publi

c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)

測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base() { cout<<"base destroyed!"<<endl; } };

派生类的构造函数和析构函数和多继承中的二义性与虚函数

析构函数主要作用是对数据成员初始化. 1派生类的构造函数 派生类的构造函数定义的一般形式为: 派生类名::派生类名(基类所需形参,本类成员所需形参):基类1(基类1 参数表),基类2(基类2 参数表),···,基类n(基类n 参数表),对象成员1(对象1 参数表),对象成员2(对象2 参数表),···,对象成员m(对象m 参数表){ //本类基本类型数据成员初始化 } 如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数.此时,系统会调用基类的默认构造函数.如果使用对象数

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用.2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用3.派生类的构造函数体中的操作 在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数.如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数. //Test1.h #include<iostream> using names

c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数

一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 class A 7 { 8 public: 9 int a,b; 10 A(); 11 A(int x,int y); 12 ~A(); 13 }; 14 A::A() 15 { 16 printf("调用A类构造函数\