内部类的继承和初始化顺序

//: BigEgg2.java
// Proper inheritance of an inner class
import java.io.*;
class Egg2 {
 protected class Yolk {
  public Yolk() {
   System.out.println("Egg2.Yolk()");
  }
  public void f() {
   System.out.println("Egg2.Yolk.f()");
  }

 }
 
 public Yolk y = new Yolk();

 public Egg2() {
  System.out.println("New egg()2");
 }
 public void insertYolk(Yolk yy) {
  y = yy;
 }
 public void g() {
  y.f();
 }
}

public class BigEgg2 extends Egg2 {
 public class Yolk extends Egg2.Yolk {
  public Yolk() {
   System.out.println("BigEgg2.Yolk()");
  }
  public void f() {
   System.out.println("BigEgg2.Yolk.f()");
  }
 }
 public BigEgg2() {
  //insertYolk(new Yolk());
  new Yolk();
 }
 public static void main(String[] args) {
  Egg2 e2 = new BigEgg2();
  //e2.g();
 }
}

从输出结果来看:

初始化顺序如下:

先初始化父类成员变量,然后父类构造函数,然后子类成员变量,子类构造函数

模板类的继承体系中 初始化顺序问题

11-11

[code=c]#include rn#include rn#include rnrnusing namespace std;rnrntemplaternclass SquareMatrixBasernprotected:rn SquareMatrixBase(std::size_t n, T* pMem)rn : size(n), pData(pMem)rn void setDataPtr(T* ptr)pData = ptr;rn void transpose(std::size_t matrixSize);rn rnprivate:rn std::size_t size;rn T* pData;rn;rnrntemplaternclass SquareMatrix: private SquareMatrixBasernprivate:rn using SquareMatrixBase::transpose;rn T data[n*n];rn rnpublic:rn SquareMatrix():rn SquareMatrixBase(n, data)rn void transpose()transpose(n);rn;rnrn/* templaternclass SquareMatrix2: private SquareMatrixBasernprotected:rn SquareMatrix2():pData(new T[n*n]),rn SquareMatrixBase(n, data)rn this->setDataPtr(pData);rnprivate:rn using SquareMatrixBase::transpose;rn T* pData;rn; */rnrnint main()rnrn SquareMatrix a;rn a.transpose();rn return 1;rn[/code]rnrn求教老司机开车rnrn这里子类SquareMatrix的构造函数中,先要调用父类SquareMatrixBase的构造函数。那么,问题来了rn在子类的构造函数当中,它尚未构造的情况下,data这个数据是哪里来的?难道说data这个指针变量是优先于父类构造函数被实例化的?rnrn另外我尝试vs2013单步调试该代码rnrn发现 跑到子类的构造函数调用父类的构造函数这一块。vs竟然知道data有4*4的大小(我的却这样构造的SquareMatrix a;),此时子类的成员不应该被初始化。rnrn我猜测的只能是编译时期的小trick了。rn编译的时候,编译器发现有SquareMatrix这样的声明,就为模板类创建了4*4大小的类型的声明。所以就有了编译器会预先分配好了空间给这个对象的说法,然后定义这个对象并调用其构造函数是为了初始化其已经分配的空间。rnrn不知道我的猜测对不对,求教~rnrnp.s. code是effective c++的代码,经过验证是合法可用的代码。书写不规范的地方请见谅.

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试