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中实现。(还有一个告诉我要重新安装)

不是很明白,总是觉着应该新开一个都写一块儿,前几回分开写就没有出现这个问题。结果编译成功。

猜你喜欢

转载自www.cnblogs.com/lovecpp/p/10937037.html