c++第五次实验
作者:互联网
part 1
两个问题:
1、派生类中出现与基类同名成员,通过对象名.成员名的方式,即代码中base2.display(),访问的成员是派生类中的成员
2、通过基类指针访问派生类对象时,在ex1_1.cpp中没有virtual,得到的结果全是基类成员函数的调用,在ex1_2.cpp中基类成员函数有virtual,结果基类派生类都依次调用。虚函数是动态捆绑基础,本质是覆盖不是重载。
Part 3
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 class MachinePets 6 { 7 public: 8 MachinePets(const string s); 9 MachinePets(); 10 string getNickname(); 11 virtual string talk() = 0; 12 virtual ~MachinePets(); 13 private: 14 string nickname; 15 }; 16 17 void play(MachinePets *p) 18 { 19 cout << p->getNickname(); 20 cout << p->talk() << endl; 21 } 22 23 MachinePets::MachinePets(const string s) :nickname(s) 24 { 25 } 26 27 28 string MachinePets::getNickname() 29 { 30 return nickname; 31 } 32 33 MachinePets::~MachinePets() 34 { 35 } 36 37 38 39 40 41 42 class PetCats :public MachinePets 43 { 44 public: 45 PetCats(const string s); 46 ~PetCats(); 47 string talk(); 48 }; 49 50 PetCats::PetCats(const string s) :MachinePets(s) 51 { 52 } 53 string PetCats::talk() 54 { 55 return " says miao wu~"; 56 } 57 PetCats::~PetCats() 58 { 59 } 60 61 62 63 64 65 class PetDogs :public MachinePets 66 { 67 public: 68 PetDogs(const string s); 69 ~PetDogs(); 70 string talk(); 71 }; 72 73 PetDogs::PetDogs(const string s) :MachinePets(s) 74 { 75 } 76 string PetDogs::talk() 77 { 78 return " says wang wang~"; 79 } 80 PetDogs::~PetDogs() 81 { 82 } 83 84 85 86 int main() { 87 PetCats cat("miku"); 88 PetDogs dog("da huang"); 89 play(&cat); 90 play(&dog); 91 return 0; 92 }宠物
实践课上出现如下报错:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2005 "void __cdecl play(class MachinePets *)" (?play@@YAXPAVMachinePets@@@Z) 已经在 MachinePets.obj 中定义 part3 C:\Users\lenovo\Desktop\part3\part3\PetDogs.obj 1
从网上查的原因是:c++在写模版函数时(template<class T>之类的),头文件不能与cpp文件分离。这就意味着,你头文件定义的含模版的地方必须在头文件中实现,没用模版定义的地方可以放在cpp中实现。(还有一个告诉我要重新安装)
不是很明白,总是觉着应该新开一个都写一块儿,前几回分开写就没有出现这个问题。结果编译成功。
标签:string,派生类,c++,第五次,实验,virtual,MachinePets,基类,cpp 来源: https://www.cnblogs.com/lovecpp/p/10937037.html