基类与派生类的构造函数

一、缺省构造函数的调用关系

通过下面的例子,我们来看一下基类与派生的构造函数的调用顺序。创建时先基类后派生类。销毁时先派生类后基类。

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

class CBase {
    string name;
    int age;
public:
    CBase() {
        cout <<"BASE" << endl;
    }
    ~CBase() {
        cout <<"~BASE" << endl;
    }
};

class CDerive : public CBase {
public:
    CDerive() {
        cout <<"DERIVE" << endl;
    }
    ~CDerive() {
        cout <<"~DERIVE" << endl;
    }
};

int main ( )
{
    CDerive d;

    return 0;
}

二、有参数时的传递

当有参数时,参数必须传送给基类。注意例子中传递的方法(第8行、第19行)。

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

class CBase {
    string name;
public:
    CBase(string s) : name(s) {
        cout <<"BASE: " << name << endl;
    }
    ~CBase() {
        cout <<"~BASE" << endl;
    }
};

class CDerive : public CBase {
    int age;
public:
    CDerive(string s, int a) : CBase(s), age(a) {
        cout <<"DERIVE: " << age << endl;
    }
    ~CDerive() {
        cout <<"~DERIVE" << endl;
    }
};

int main ( )
{
    CDerive d("小雅", 27);

    return 0;
}

三、祖孙三代的参数传递

当有三层继承时,参数要一层一层地传递下去(第30行、第19行、第8行)。

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

class CBase {
    string name;
public:
    CBase(string s) : name(s) {
        cout <<"BASE: " << name << endl;
    }
    ~CBase() {
        cout <<"~BASE" << endl;
    }
};

class CDerive : public CBase {
    int age;
public:
    CDerive(string s, int a) : CBase(s), age(a) {
        cout <<"DERIVE: " << age << endl;
    }
    ~CDerive() {
        cout <<"~DERIVE" << endl;
    }
};

class CSon : public CDerive {
    string id;
public:
    CSon(string s1, int a, string s2) : CDerive(s1, a), id(s2) {
        cout <<"SON: " << id << endl;
    }
    ~CSon() {
        cout <<"~SON" << endl;
    }
};

int main ( )
{
    CSon s("小雅", 27,"8503026");

    return 0;
}
时间: 2024-08-05 19:07:58

基类与派生类的构造函数的相关文章

C++ Primer 学习笔记_31_面向对象编程(2)--继承(二):继承与构造函数、派生类到基类的转换 、基类到派生类的转换

C++ Primer 学习笔记_31_面向对象编程(2)--继承(二):继承与构造函数.派生类到基类的转换 .基类到派生类的转换 一.不能自动继承的成员函数 构造函数 拷贝构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数). 派生类的构造函数需要给基类的构造函数传递参数 #include <iostream

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

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

C++:基类与派生类对象之间的赋值兼容关系

4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量.这种不同类型之间的自动转换,称为赋值兼容.在基类和派生类对象之间也存在有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替.因为,通过公有继承,除了构造函数和析构函数外,派生类保留了基类其他的所有的成员.那么,派生类就具有基类的全部功能,凡

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

C++:基类和派生类

4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"<<name<<endl; cout<<"age:"<<age<<endl; cout<<"sex:"<<sex<<endl; } protected: string name;

c++中基类与派生类中隐含的this指针的分析

先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 public: 6 int x; 7 Parent *p; 8 public: 9 Parent(){} 10 Parent(int x){ 11 this->x=x; 12 p=this; 13 } 14 virtual void f(){ 15 cout<<"Parent::f()&q

C++ Primer 学习笔记_65_面向对象编程 -概述、定义基类跟派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

定义基类和派生类

定义基类 对于基类,我们需要记住的是作为继承关系中根节点的类通常都会定义一个虚析构函数. 基类通常都会定义一个虚析构函数,即使该函数不执行任何实际操作也是如此. 成员函数和继承 派生类可以继承其基类的成员,也可以对基类中的虚函数进行重新定义.换句话说,派生类需要对这些操作提供自己的新定义以覆盖(override)从基类继承而来的旧定义. 在C++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数:另一种是基类希望派生类直接继承而不要改变的函数.对于前者,基类通过将其

C++基类和派生类之间的转换

本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A(int m1, int n1):m(m1), n(n1){} 8 void display(); 9 private: 10 int m; 11 int n; 12 }; 13 14 void A::display() 15 { 16 cout <&