《C++语言基础》程序阅读——继承和派生

返回:贺老师课程教学链接

(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 G
{
public:
    static int m;
    G( )  //构造函数
    {
        m++;
        cout<<"G begins\n";
    }
    ~G( )
    {
        cout<<"G ends\n";
        m--;
    }
};
int G::m=0;
class D:public G
{
public:
    D( )  //构造函数
    {
        m++;
        cout<<"D begins\n";
    }
    ~D( )
    {
        cout<<"D ends\n" ;
        m-- ;
    }
};
int main( )
{
    D objg;
    cout<<G::m<<endl;
    return 0;
}

(3)

#include<iostream>
using namespace std;
class  A
{
private:
    int  x;
protected:
    int y;
public:
    int z;
    A(int a,int b,int c)
    {
        x=a;
        y=b;
        z=c;
    }
    int  Getx()
    {
        return x;
    }
    int  Gety()
    {
        return y;
    }
    void ShowA()
    {
        cout<< "x="<<x<<'\t';
        cout<<"y="<<y<<'\t';
        cout<<"z="<<z<<'\n';
    }
};
class B:public A   //修改点(见后面阅读要求)
{
private:
    int m,n;
public:
    B(int a,int b,int c,int d,int e):A(a,b,c)
    {
        m=d;
        n=e;
    }
    void Show()
    {
        cout<<"m="<<m<<'\t'<<"n="<<n<<'\n';
        cout<<"x="<<Getx()<<'\t';
        cout<<"y="<<y<<'\t'<<"z="<<z<<'\n';
    }
    int Sum()
    {
        return (Getx()+y+z+m+n);
    }
};
int main()
{
    B b1(1,2,3,4,5);
    b1.ShowA();
    b1.Show();
    cout<< "Sum="<<b1.Sum()<<'\n';
    cout<<"x="<<b1.Getx()<<'\t';
    cout << "y=" <<b1.Gety()<<'\t';
    cout << "z="<<b1.z<<'\n';
    return 0;
}

先阅读程序,写出你预想的运行结果,再记录运行结果,如果两者有差异,再读程序给出解释。
观察基类A中成员的访问权限制以及派生类B中对这些成员的访问方法。
请将class B:public A 中的public改为protected或者删除,对程序进行编译,解释出现的情况。

(4)
#include <iostream>

using namespace std;
class Part  //部件类
{
public:
    Part();
    Part(int i);
    ~Part();
private:
    int val;
};
Part::Part()
{
    val=0;
    cout<<"调用Part的默认构造函数:"<<val<<endl;
}
Part::Part(int i)
{
    val=i;
    cout<<"调用Part的构造函数: "<<val<<endl;
}
Part::~Part()
{
    cout<<"调用Part的析构函数: "<<val<<endl;
}
class Whole: public Part
{
public:
    Whole();
    Whole(int,int,int,int);
    ~Whole();
private:
    Part one;
    Part two;
    int data;
};
Whole::Whole()
{
    data=0;
    cout<<"调用whole的默认构造函数: "<<data<<endl;
}
Whole::Whole(int p, int i,int j,int k):Part(p),one(j),two(i),data(k)  //问题2
{
    cout<<"调用whole的构造函数: "<<data<<endl;
}
Whole::~Whole()
{
    cout<<"调用whole的析构函数: "<<data<<endl;
}
void f()
{
    Whole w1;
    Whole w2(1,2,3,4);
}
int main()
{
    f();
    return 0;
}

先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。
将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。

Whole::Whole(int p, int i,int j,int k):  Part(p),two(i),one(j),data(k)  //问题2

自选阅读:若还想通过运行程序的方式掌握继承机制的运行过程,阅读并运行下面的程序
(1)

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A";
    }
    ~A()
    {
        cout<<"~A";
    }
};
class B :public A
{
    A *p;
public:
    B()
    {
        cout<<"B";
        p=new A();
    }
    ~B()
    {
        cout<<"~B";
        delete p;
    }
};
int main()
{
    B obj;
    return 0;
}

(2)

#include <iostream>
using namespace std;
class A
{
protected:
    int x;
public:
    A(int x)
    {
        A::x=x;
        cout<<"class A"<<endl;
    }
};
class B
{
private:
    A a1;
public:
    B(int x):a1(x)
    {
        cout<<"class B"<<endl;
    }
};
class C:public B
{
private:
    A a2;
public:
    C(int x):B(x),a2(x)
    {
        cout<<"class C"<<endl;
    }
};
class D:public C
{
public:
    D(int x):C(x)
    {
        cout<<"class D"<<endl;
    }
};
int main()
{
    D dobj(10);
    return 0;
}

(3)

#include<iostream>
using namespace std;
class my_base
{
    int a,b;
public:
    my_base(int x,int y)
    {
        a=x;
        b=y;
    }
    virtual void show()
    {
        cout<<"base";
        cout<<a<<" "<<b<<endl;
    }
};
class my_class: public my_base
{
    int c;
public:
    my_class(int x,int y,int z):my_base(x,y)
    {
        c=z;
    }
    void show()
    {
        cout<<"my_class "<<"c="<<c;
    }
};
int main()
{
    my_base mb(50,50),*mp;
    my_class mc(10,20,30);
    mp=&mb;
    mp->show();
    mp=&mc;
    mp->show();
    return 0;
}

【阅读- 长颈鹿类对动物类的继承】理解基类中成员的访问限定符和派生类的继承方式
请在下面的程序中要求的位置写下注释,声明相应的语句在语法上是否正确,为什么。在第一个程序中给出了示例,其他位置请仿照完成。在上机时,可以编译程序加以验证,阅读错误给出的英文提示,并加以理解。
(1)public继承方式下

#include <iostream>
using namespace std;
class Animal    //动物类
{
public:
    Animal() {}
    void eat(){
        cout << "eat\n";
    }
protected:
    void play()
    {
        cout << "play\n";
    }
private:
    void drink()
    {
        cout << "drink\n";
    }
};
class Giraffe: public Animal   //长颈鹿类
{
public:
    Giraffe() {}
    void StrechNeck()
    {
        cout << "Strech neck \n";
    }
private:
    void take()
    {
        eat();        // 正确,公有继承下,基类的公有成员对派生类可见
        drink();      // _______________
        play();       // _______________
    }
};
int main()
{
    Giraffe gir;      //定义派生类的对象
    gir.eat();        // 正确,公有继承下,基类的公有成员对派生类对象可见
    gir.play();       // _______________
    gir.drink();      // _______________
    gir.take();       // _______________
    gir.StrechNeck(); // _______________
    Animal ani;
    ani.eat();        // _______________
    ani.play();       // _______________
    ani.drink();      // _______________
    ani.take();       //错误,派生类的成员对基类对象(不论访问属性)不可见
    ani.StrechNeck(); // _______________
    return 0;
} 

(2)private继承方式下

#include <iostream>
using namespace std;
class Animal
{
public:
    Animal() {}
    void eat()
    {
        cout << "eat\n";
    }
protected:
    void play()
    {
        cout << "play\n";
    }
private:
    void drink()
    {
        cout << "drink\n";
    }
};
class Giraffe: private Animal
{
public:
    Giraffe() {}
    void StrechNeck()
    {
        cout << "Strech neck \n";
    }
    void take()
    {
        eat();     // _______________
        drink();   // _______________
        play();    // _______________
    }
};
int main()
{
    Giraffe gir;
    gir.eat();    // _______________
    gir.play();   // _______________
    gir.drink();  // _______________
    return 0;
}

(3)protected继承方式下

#include <iostream>
using namespace std;
class Animal
{
public:
    Animal() {}
    void eat()
    {
        cout << "eat\n";
    }
protected:
    void play()
    {
        cout << "play\n";
    }
private:
    void drink()
    {
        cout << "drink\n";
    }
};
class Giraffe: protected Animal
{
public:
    Giraffe() {}
    void StrechNeck()
    {
        cout << "Strech neck \n";
    }
    void take()
    {
        eat();    // _______________
        drink();  // _______________
        play();   // _______________
    }
};
int main()
{
    Giraffe gir;
    gir.eat();   // _______________
    gir.play();  // _______________
    gir.drink(); // _______________
    return 0;
}
时间: 2024-07-31 08:08:31

《C++语言基础》程序阅读——继承和派生的相关文章

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

阅读程序,请写出这些程序的运行结果 (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<<&q

C++语言基础 例程 基类与派生类的转换

贺老师的教学链接  本课讲解 指向基类对象的指针变量也可以指向派生类对象 #include <iostream> #include <string> using namespace std; class Student//声明Student类 { public: Student(int, string,float); void display( ); private: int num; string name; float score; }; Student::Student(in

《Abaqus GUI程序开发指南(Python语言)》——第二章 Python语言基础2.1 Python语言的特点

第二章 Python语言基础 Abaqus GUI程序开发指南(Python语言)Python语言是一种动态解释型编程语言,其功能强大,简单易学,支持面向对象编程(object-oriented programming),虽然由于其动态性致使程序解释执行速度比编译语言慢,但是随着Python语言的不断优化以及计算机硬件的迅猛发展,Python语言将会受到越来越多用户的关注.Python具有开源.自由等特征.它的简洁性和易用性使程序的开发过程变得简单,特别适用于快速应用程序开发. 本章将简要介绍P

《21天学通C语言(第7版)》一第1部分 C语言基础 第2课 C程序的组成部分 2.1 简短的C程序

第1部分 C语言基础 21天学通C语言(第7版)本文仅用于学习和交流目的,不代表异步社区观点.非商业转载请注明作译者.出处,并保留本文的原始链接. 第2课 C程序的组成部分 21天学通C语言(第7版)每个C程序都由多个部分组成.本书绝大多数篇幅都在解释各种程序的组成部分以及如何使用它们.为了帮助读者掌握C程序的概况,首先介绍一个完整(但简短)的C程序,并识别其中的每个部分.本课将介绍以下内容: 简短C程序的组成部分每个程序组成部分的用途如何编译并运行程序示例本文仅用于学习和交流目的,不代表异步社

现在只有不太熟练的C语言基础,要在一个月内用vc7编出一个带界面的邮件解析程序,该怎么办?

问题描述 现在真是急死了,看代码看得不是很懂,更别说写了.现在又要从C++开始学起吗:( 解决方案 解决方案二:支持MIME解析的开源代码应该很多.参照一下即可.还有一个简便的方式.在界面里内嵌一个Outlook对象.就OK了.解决方案三:自己解析的话看rfc1341不难,就是麻烦了点解决方案四:最实际的办法:网上下个例子,边改边学!解决方案五:连C语言基础都不太熟练的,要在一个月内做个带界面的邮件解析程序,我看没戏,除了抄,我看还是外包吧!解决方案六:外包我感兴趣,哈哈.解决方案七:自己写?不

c语言基础-真的很着急,大一学生党,求大神指导写一个c语言拨号程序

问题描述 真的很着急,大一学生党,求大神指导写一个c语言拨号程序 能显示出通讯录中所有人姓名,当选中某个姓名时,屏幕上模拟打字机效果依次显示出此人的电话号码中的各个数字,并伴随相应的拨号声 解决方案 http://zhidao.baidu.com/link?url=svF4fjRTNuBmCJyCiRipzB_21UO5zvNc0hCye7qj8nxOY1lC78667ycDqYnJ7xHiGT00M4NuYqGIak2R5cEU961mjRl1ADLf-Eh1nDKpiBi

c++基础语法:普通继承_C 语言

1.首先说一下类的成员函数或者成员变量的3个属性:public:    对于对象和成员函数都是可见的,即可以引用protected: 对于成员函数是可见的,但对于对象来说是不可见的,这个声明主要是用在继承 中,下面将讨论private:   对于成员函数是可见的,对于对象是不可见的 2.然后看一下继承方式: 基类成员关键字            派生类继承方式        派生类对基类成员访问权限public                    public                相

《C++语言基础》网络课程主页

返回 贺利坚教学链接 本课程是在大学的实体课程基础上建设的一门网络课程,将我在教学中建设的资源,让更多的人能够用到. 课程链接是:点击打开链接 同步实体课在 点击打开链接,那里有92名同时学习的"同学",以及他们的博客链接. 坚持这门课程学习的学员,请在评论处留言,我将建立专门的链接,一起建设学习的氛围. 学员链接:(待加) 课程内容 一.从C到C++ 课时 视频 示例程序 自测 学习指导与实践 实践项目参考解答 1.1 由C语言到C++(暨本课介绍) 链接   1.2 C语言的基本成

C++语言基础-入门简介

C++是个强大的语言,可以用于做别的语言做不了的工作.但是,这种强大功能是有代价的.开始使用C++时,你可能会遇到内存溢出和访问失效等问题,使程序死机.这里用最简短的篇幅介绍C++语言基础.C++语言本身有专著介绍,这种书还特别厚,所以别指望我能用三言两语说清楚.读者学完本书并使用C++ Builder一般时间之后,最后对C++语言再作更深入的了解. C++可以最充分地利用面向对象编程(OOP)的优势.OOP不只是一个新名词,而有它的实际意义,可以生成可复用的对象.新术语 对象(object),