您现在的位置是:首页 > 文章详情

C++和Java的继承——构造函数问题

日期:2018-09-09点击:403

C++

【1】声明子类变量 B b;
a.如果子类没有显示调用父类含参数的构造函数,那么在子类实例化过程中,

---顺序: 父类无参(默认)构造函数-->子类被调用的构造函数。

b.如果子类显示调用了父类的含参构造函数,那么在子类实例化过程中,

---顺序: 父类有参构造函数-->子类被调用的构造函数。

实例:

class A { public: A() { printf("A(void) \n"); }//父类 默认构造函数 A(int d) { printf("A %d\n", d); }//父类 有参构造函数 ~A() { printf(" ~A \n"); }//父类 析构函数 }; class B : public A { public: B(){ printf("B(void) \n");//子类 默认构造函数 } B(int x) : A(x) { printf("B \n"); //子类 有参构造函数 } ~B() { printf("~B \n"); } //子类 析构函数 }; int main(int argc, char* argv[]) { B c; B b(8); // 此处也自动调用了A的同签名的构造函数 return 0; }

输出结果:
image

B c;//创建c这个实例的时候 先调用A() 然后B() B b(8);//先调用A(int x) 然后B(int x) 销毁的时候 后入先销毁

实例:

class A { public: virtual void foo() { cout << "A's foo()" << endl; bar(); } virtual void bar() { cout << "A's bar()" << endl; } }; class B: public A { public: void foo() { cout << "B's foo()" << endl; A::foo(); } void bar() { cout << "B's bar()" << endl; } }; int main() { B bobj; A *aptr = &bobj; aptr->foo(); A aobj = *aptr; //转化为A类对象 aobj.foo(); }

输出结果:
image

B bobj; A *aptr = &bobj; aptr->foo(); //输出B's foo() A's foo() B's bar() //因为aptr指向的是B类对象 先调用B类foo() //而A::foo() 调用A类foo()和foo()中的bar() A aobj = *aptr; //转化为A类对象 aobj.foo();//都是A类方法 //

Java

【1】父类和子类同时都有有参的构造函数和无参构造函数

Java中的子类初始化时初值为空。调用顺序为先调用父类无参构造函数,然后调用子类无参构造函数。

java中的子类初始化时初值不为空。调用顺序为先调用父类参构造函数,然后调用子类有参构造函数。
image
输出
image
先调用父类再调用子类

image
输出
image
调用父类无参 子类带参

【2】父类和子类无无参构造函数只有有参构造函数

java中的子类初始化时初值不为空。调用顺序为先调用父类有参构造函数(必须在子类有参构造函数中加显示super),然后调用子类有参构造函数。
image
输出结果

image

调用函数问题

定义一个父类
image
定义子类为
image

执行命令
image
输出:
image
静态方法(随着类的加载而加载)
非静态方法和构造函数随着对象
静态>非静态>构造
同为静态加载顺序按先后,静态方法调用才执行

只执行
image
输出结果
image
先加载父类的静态 然后加载本身静态

原文链接:https://yq.aliyun.com/articles/637397
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章