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

简介:

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

目录
相关文章
|
12天前
|
Java
Java中的继承和多态是什么?请举例说明。
Java中,继承让子类继承父类属性和方法,如`class Child extends Parent`,子类可重写父类方法。多态允许父类引用指向子类对象,如`Animal a = new Dog()`,调用`a.makeSound()`会根据实际对象类型动态绑定相应实现,增强了代码灵活性和可扩展性。
10 0
|
19天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
15 3
|
26天前
|
C++
8. C++继承
8. C++继承
22 0
|
13天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
26天前
|
安全 Java 编译器
C++:继承
C++:继承
30 0
|
30天前
|
安全 Java 编译器
C++:继承与派生
C++:继承与派生
|
27天前
|
编译器 C语言 C++
【c++】类和对象(三)构造函数和析构函数
朋友们大家好,本篇文章我们带来类和对象重要的部分,构造函数和析构函数
|
29天前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
41 0
|
29天前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
30 0
|
29天前
|
Java 数据处理 数据库
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(二)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
34 0