1//############################################################################ 2/* 3任何时候都不要在构造函数或析构函数中调用虚函数 4*/ 5class dog { 6 public: 7 string m_name; 8 dog(string name) {m_name = name; bark();} 9 virtual void bark() { cout<< "Woof, I am just a dog " << m_name << endl;} 10}; 11 12class yellowdog : public dog { 13 public: 14 yellowdog(string name) : dog(string name) {...} 15 virtual void bark() { cout << "Woof, I am a yellow dog " << m_name << endl; } 16}; 17 18int main () 19{ 20 yellowdog mydog("Bob"); 21} 22 23 24输出: 25Woof, I am just a dog Bob. 26 27/* 28在构造的过程中,所有虚函数表现为非虚函数 29 30为什么? 31基类在派生类之前构造。 32所以bark()的时候,yellowdog还没有构造 33 34 35为什么Java中表现不一样? 36 37Java和C++在定义对象的生命周期上有一个基本的差异 38Java: 所有成员在构造函数运行前被null初始化。生命周期在构造函数之前已经开始 39C++: 构造函数负责初始化成员。生命周期在构造函数结束之后才开始 40 41调用对象中还未被初始化的部分是继承危险的 42调用对象中已经被delete的部分也是危险的 43*/ 44 45 46/* 47解决方法 1: 48不使用多态,使用初始化参数来产生运行时差异 49*/ 50class dog { 51 public: 52 ... 53 dog(string name, string color) {m_name = name; bark(color);} 54 void bark(string str) { cout<< "Woof, I am "<< str << " dog " << m_name << endl;} 55}; 56 57class yellowdog : public dog { 58 public: 59 yellowdog(string name):dog(name, "yellow") {} 60}; 61 62int main () 63{ 64 yellowdog mydog("Bob"); 65} 66 67输出: 68Woof, I am yellow dog Bob 69 70 71/* 72解决方法 2: 73使用私有静态成员函数,不同派生类可执行不同操作 74*/ 75class dog { 76 public: 77 ... 78 dog(string name, string woof) {m_name = name; bark(woof);} 79 dog(string name) {m_name = name; bark( getMyColor() );} 80 void bark(string str) { cout<< "Woof, I am "<< str << " dog " << m_name << endl;} 81 private: 82 static string getMyColor() {return "just a";} 83}; 84 85class yellowdog : public dog { 86 public: 87 yellowdog(string name):dog(name, getMyColor()) {} 88 private: 89 static string getMyColor() {return "yellow";} //Why static? 90}; 91 92int main () 93{ 94 yellowdog mydog("Bob"); 95} 96OUTPUT: 97Woof, I am yellow dog Bob
C++进阶
Wesley13
2021-10-11
1447 0 0
点赞
收藏
评论区
加载中...