c++——继承类中的子对象和基类对象的初始化

先给结论:

(1)派生类中的基类子对象和子对象必须初始化,初始化在派生类的构造函数的初始化列表中,如果初始化列表中没有进行初始化,则调用缺省的构造函数进行初始化。

(2)派生类构造函数的调用顺序:

基类的构造函数

子对象类的构造函数

派生类的构造函数

例子

class point1
{
public:
 point1();
 point1(int i);
 virtual ~point1();
private:
  int x;
};
point1::point1()
{
   x=1;
   cout<<"point1's default constructor called!\n";
}
point1::point1(int i)
{
 x=i;
    cout<<"point1's  constructor called!\n";
}
point1::~point1()
{
}

class point2 : public point1
{
public:
 point2();
 point2(int i,int j,int k);
 virtual ~point2();
 point1 p;
};
point2::point2()
{
    cout<<"point2's defaule constructor called\n";
}
point2::point2(int i,int j,int k)
{
 cout<<"point2's constructor called\n";
}
point2::~point2()
{
}

//主函数
void main()
{
   point2 pp;
   point2 pp1(1,2,3);
}

运行结果

point1's default constructor called!// point1 p;调用了基类默认构造函数
point1's default constructor called!//
point2's defaule constructor called
point1's default constructor called!// point1 p;调用了基类默认构造函数
point1's default constructor called!
point2's constructor called

如果函数

point2::point2(int i,int j,int k)
{
 cout<<"point2's constructor called\n";
}

改为:

point2::point2(int i,int j,int k):p(j)
{
 cout<<"point2's constructor called\n";
}

运行结果为:

point1's default constructor called!
point1's default constructor called!
point2's defaule constructor called
point1's default constructor called!
point1's  constructor called!
point2's constructor called

时间: 2024-10-22 06:59:26

c++——继承类中的子对象和基类对象的初始化的相关文章

详解C++中基类与派生类的转换以及虚基类

很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

static 类中的静态成员,组合类,友元函数 ,内部类

static 表示静态的意思 在c++中有两种表示 ,静态成员变量和静态成员函数 一个类中的静态成员只属于当前类,不属于某个对象.一个类的静态成员只有一份由当前类所有,每个对象都可以访问静态成员,当然也可以通过类名来访问 这里推荐用类名::静态成员来访问 static 成员函数应该在所有的成员函数之外初始化 如果不初始化系统默认为0 static 成员函数只能访问static成员 static成员函数  ,函数体内不能使用this指针 在我前前面已经说过组合类的概念了,今天我再介绍两个类,友元,

C++类中常量数据成员和静态数据成员初始化

常量数据成员初始化原则: 在每一个构造函数的初始化列表中初始化 静态数据成员初始化原则: 类内声明,类外初始化(因为它是属于类的,不能每构造一个对象就初始化一次) // test_max.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <vector> using namespace std; class A { public: A(int i):a(0) {} A():

对Integer类中的私有IntegerCache缓存类的一点记录

对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可以直接使用 == 来比较是否相等 Integer a = 88; Integer b = 88; System.out.println(a == b); // true // 下面这个不在Integer缓存类里的数字,在每次赋值的时候都会新建一个对象存放 // 所以,它们不能使用 == 来判断是否相

C#:在继承的子类中初始化基类字段,并访问基类字段,方法

一.基类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Inherit { public class Person { private string _name; private int _age; private int _height; private string _gender; pr

MVC中Spring.net 对基类控制器无效 过滤器控制器无效

比如现在我又一个BaseController作为基类控制器,用于过滤权限.登录判断等作用,其它控制由原本的继承Controller,改为继承BaseController.然后BaseController重写Controller中方法OnActionExecuting 当我们此时再访问 User控制器下的某个Action,那么问题就来了,服务器会先执行BaseController中的OnActionExecuting方法,而此时,iu并没有由spring.net创建!!依旧为null 经过几次测试

不存在继承关系各类中、不存在对象引用的对象创建初始化顺序

实例3 class One   {        One(String str)      {        System.out.println(str);       }    } class Two   {       One one_1 = new One("one-1");       One one_2 = new One("one-2");       One one_3 = new One("one-3");      Two(S

类中使用静态的建造类

以spring security中的User类为例,User类中定义了UserBuilder类,同时,User也可以使用UserBuilder,方便了User对象的构建. /* * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file ex