2015级C++第10、11周程序阅读 继承和派生

简介: 阅读程序,请写出这些程序的运行结果 (1)阅读程序,写出执行结果#include <iostream>using namespace std;class Data{public: Data(int i):x(i){cout<<"A";} ~Data(){ cout<<"B";}private: i

阅读程序,请写出这些程序的运行结果
(1)阅读程序,写出执行结果

#include <iostream>
using namespace std;
class Data
{
public:
    Data(int i):x(i){cout<<"A";}
    ~Data(){ cout<<"B";}
private:
    int x;
};
class Base
{
public:
    Base(int i):b1(i){cout<<"C";}
    ~Base(){ cout<<"D";}
private:
    int b1;
};
class Derived:public Base
{
public:
    Derived (int i,int j):Base(i),d1(j){
        cout<<"E";
    }
    ~Derived(){cout<<"F";}
private:
    Data d1;
};
int main()
{
    Derived obj(1,2);
    return 0;
}

(2)阅读程序,写出执行结果

#include <iostream>
using namespace std;
class A
{
public:
    A(){a=0;}
    A (int i){a=i;}
    void print(){cout<<a<<"  ";}
private:
    int a;
};
class B: public A
{
public:
    B(){b=0;}
    B(int i, int j, int k): A(i),aa(j){b=k;}
    //思考:这3处出现的print,有何区别
    void print()      //(1)
    {
        A::print();   //(2)
        aa.print();   //(3)
        cout<<b<<endl;
    }
private:
    int b;
    A aa;
};
int main()
{
    B test[2];
    test[0]=B(1,4,7);
    test[1]=B(2,5,8);
    for(int i=0; i<2; i++)
        test[i].print();
    return 0;
}

(3)阅读程序,写出执行结果

#include <iostream>
using namespace std;
class A
{
public:
    A(char *s){cout<<s<<endl;}
};
class B:public A
{
public:
    B(char *s1, char *s2):A(s1){
        cout<<s2<<endl;
    }
};
class C:public A
{
public:
    C(char *s1,char *s2):A(s1){
        cout<<s2<<endl;
    }
};
class D:public B, C
{
public:
    D(char *s1,char *s2,char *s3,char *s4):
        B(s1,s2),C(s3,s4){cout<<s4<<endl;}
};
int main()
{
    D d("class A","class B","class C","class D");
    return 0;
}

(4)阅读程序,写出执行结果

#include <iostream>
using namespace std;
class Base
{
public:
    Base(char i) { cout<<"Base constructor. --"<<i<<endl; }
};
class Derived1:virtual public Base
{
public:
    Derived1(char i,char j):Base(i){
        cout<<"Derived1 constructor. --"<<j<<endl;
    }
};
class Derived2:virtual public Base
{
public:
    Derived2(char i,char j):Base(i){
        cout<<"Derived2 constructor. --"<<j<<endl;
    }
};
class MyDerived: public Derived1,public Derived2
{
public:
    MyDerived(char i,char j,char k,char l,char m,char n,char x): 
    Derived2(i,j), Derived1(k,l), Base(m), d(n){
        cout<<"MyDerived constructor. --"<<x<<endl;
    }
private:
    Base d;
};
int main()
{
    MyDerived obj('A','B','C','D','E','F','G');
    return 0;
}

(5)阅读下面类的定义,请说出在测试函数中不同情况的调用产生的结果

#include <iostream>
using namespace std;
class A
{
protected:
    int a,b;
public:
    A(int aa, int bb):a(aa), b(bb) {}
    void printA(){
        cout<<"a: "<<a<<"\tb: "<<b<<endl;
    }
};
class B: public A
{
    int c;
public:
    B(int aa, int bb, int cc):A(aa,bb),c(cc) {}
    void printB()
    {
       cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl;
    }
};
int main()
{
    A a(1,1);
    B b(2,3,4);
    //此处加入下面各小题中的代码
    return 0;
}

(a)

    a=b;
    a.printA();
    b.printA();
    b.printB();

你认为输出结果是:____________
运行程序的结果是:____________
(b)

    b=a;
    a.printA();
    b.printA();
    b.printB();

程序会发生编译错误,原因是:____
记录下IDE中提示的错误并理解:___
(c)

    A &r1=a;
    A &r2=b;
    r1.printA();
    r2.printA();
    r2.printB();

将会发生错误的一行删除;
对余下的程序,你认为输出是:____
实际运行的输出是:__________
那一行的错误原因是:________
(d)

    A *p=&a;
    p->printA();
    p=&b;
    p->printA();
    p->printB();

将会发生错误的一行删除;
对余下的程序,你认为输出是:____
实际运行的输出是:__________
那一行的错误原因是:________
(e)
在class A中增加成员函数:int getA(){return a;}
在main函数前增加一般函数:

void f(A x)
{
    cout<<"aaaaah, my a: "<<x.getA()<<endl;
}

main函数中指定部分为:

    f(a);
    f(b);

你认为输出结果是:____________
运行程序的结果是:____________

目录
相关文章
|
4月前
|
存储 安全 Java
c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
94 0
|
7月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
362 6
|
9月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
136 16
|
9月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
183 5
|
11月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
162 1
【C++】继承
|
12月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
101 0
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
95 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
173 0
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
186 12