实验五

part 1

part 2:

part 3:

#include <iostream>
#include<string>
using namespace std;
class MachinePets {
public:
    MachinePets() {}
    MachinePets(const string s):nickname(s) {}
    string getnickname(){return nickname;}
    
    virtual string talk() = 0;

private:
    string nickname;
};
class PetCats :public MachinePets {
public:
    PetCats(const string s) :MachinePets(s) { }
    string talk() {
        return "  says miao miao miao";
    }
};
class PetDogs :public MachinePets {
public:
    PetDogs(const string s) :MachinePets(s) {}
    string talk() {
        return "  says wang wang wang";
    }
};
void play(MachinePets *ptr)
{
    cout <<ptr->getnickname()<< ptr->talk() << endl;
}


int main()
{
    PetCats cat("miku");  
    play(&cat);
    PetDogs dog("da huang");        
    play(&dog);
    return 0;
}

 

part1问题一:

 在多层继承中,派生类中出现与基类同名成员时,通过对象名.成员名的方式,访问的成员什么?

答:在多重继承中,如果派生类的成员与基类的成员重名时,按照同名隐藏原则,派生类的新成员隐藏外层的同名成员,此时对象名.成员名访问的就是派生类的重名成员。

part1问题二:

通过基类指针访问派生类对象时,基类中成员函数有无关键字virtual,访问的成员分别是什么?

答:基类中没有虚函数时,通过基类指针访问派生类时访问的只是从基类继承过来的同名成员。 当基类中有虚函数时,通过基类指针访问派生类时访问的时当前指向的对象的成员。

part2问题:

运行程序ex2.cpp,结合运行结果,理解抽象类、纯虚函数的用途,以及printArea()扮演的功能接口角色。

答:

纯虚函数是在基类中定义的虚函数,它没有函数体,它的函数体由派生类实现,而这种实现就可以有多态性。有纯虚函数的类就叫抽象类,抽象类是没有对象的不过可以有抽象类的
指针,通过这个指针访问派生类对象和成员,而这个访问也是具有多态性的。在这里Shape, Rectangle, Circle属于同一个类族,抽象类Shape通过纯虚函数area()提供了一个外部接口,而派生类有给纯虚函数具体的实现,同时因为赋值兼容原则,抽象类类型的指针p也可以指向任意派生类的对象,所以p就访问了Rectangle, Circle类对象的成员,从而进行了多态处理,分别输出了各自的面积。

关于part3:

1.对于纯虚函数的运用与part2中求area的用法是类似的,在基类中创建一个纯虚函数,作为一个公共接口,在派生类中分别给出函数实现,从而实现了多态的要求,在调用的时候使用一个基类的指针,指向基类的成员,从而再指向派生类的成员,多态处理纯虚函数。

2.在这一题里也犯了一些错误,比如纯虚函数是不能实例化的,也就是没有抽象类的对象,所以不能创建抽象函数对象在PetCats和Petcats派生类的私有成员里。

3.也可以把基类中的getnickname函数写成void类型,函数体直接输出nickname,最后在主函数里用基类指针指向这个函数也能实现输出nickname的功能。

第一个评论:

 https://www.cnblogs.com/mzx1999/p/10976477.html

第二个评论:

https://www.cnblogs.com/hongzai1206/p/10972847.html

第三个评论:

 

posted @ 2019-05-28 18:45  21savage  阅读(114)  评论(0)    收藏  举报