第五次实验
1.(1)在多层继承中,派生类中出现与基类同名成员时,通过对象名.成员名的方式,访问的成员什么?
访问的成员是该对象名所在类的成员。
(2)通过基类指针访问派生类对象时,基类中成员函数有无关键字virtual,访问的成员分别是什么?
有virtual时访问的是派生类的成员,无virtual时访问的是基类的成员。
3.设计并实现一个机器宠物类MachinePets。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include"machinepets.h" #include"petcats.h" #include"petdogs.h" using namespace std; void play(MachinePets &v) { cout << v.getnickname() << " says " << v.talk() << endl; } int main() { PetCats cat("miku"); play(cat); PetDogs dog("da huang"); play(dog); system("pause"); return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef MACHINEPETS_H #define MACHINEPETS_H #include<iostream> #include<string> using namespace std; class MachinePets { public: MachinePets(const string s = " ") :nickname(s) {} virtual string talk() = 0; string getnickname() { return nickname; } private: string nickname; }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef PETCATS_H #define PETCATS_H class PetCats : public MachinePets { public: PetCats(const string s) :MachinePets(s) {} string talk() { return "miao wu~"; } }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef PETDOGS_H #define PETDOGS_H class PetDogs : public MachinePets { public: PetDogs(const string s) :MachinePets(s) {} string talk() { return "wang wang~"; } }; #endif
实验总结与体会:
1.本实验让我更深刻地了解了虚函数、纯虚函数、抽象类的定义和使用
2.我知道了通过基类指针访问派生类对象时,基类中成员函数有无关键字virtual的区别,有virtual时访问的是派生类的成员,无virtual时访问的是基类的成员。
3.我知道了在派生类中出现与基类同名成员时,通过派生类访问该同名成员时,访问的只是派生类中的成员,基类中的被自动忽略。