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

  1. 云栖社区>
  2. 博客列表>
  3. 正文

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

雅痞士 2018-09-10 10:04:00 浏览6417 评论0

摘要: C++ 【1】声明子类变量 B b;a.如果子类没有显示调用父类含参数的构造函数,那么在子类实例化过程中, ---顺序: 父类无参(默认)构造函数-->子类被调用的构造函数。 b.如果子类显示调用了父类的含参构造函数,那么在子类实例化过程中, ---顺序: 父类有参构造函数-->子类被调用的构造函数。

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
先加载父类的静态 然后加载本身静态

用云栖社区APP,舒服~

【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入!  详情请点击

网友评论

作者关闭了评论
雅痞士
文章9篇 | 关注0
关注
Node.js 性能平台(Node.js Performance Platform)是面向中... 查看详情
云数据库PPAS版,是阿里云与EnterpriseDB公司合作基于PostgreSQL高度兼... 查看详情
PostgreSQL被业界誉为“最先进的开源数据库”,面向企业复杂SQL处理的OLTP在线事... 查看详情
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效... 查看详情
阿里云总监课正式启航

阿里云总监课正式启航