首页 > 代码库 > 引用对象做向上转换,但对虚函数不影响使用
引用对象做向上转换,但对虚函数不影响使用
//: WIND2.CPP -- Inheritance & upcasting #include <iostream.h> enum note { middleC, Csharp, Cflat }; // Etc. class instrument { public: void play(note) const { // 不是虚函数 cout << "instrument::play" << endl; } }; class wind : public instrument { public: void play(note) const { cout << "wind::play" << endl; } }; void tune(instrument& i) { // 引用对象不会造成切片 i.play(middleC); } main() { wind flute; // tune要求父类的引用对象,但这里定义的是子类对象 tune(flute); // 可以传递子类,但做了向上转换Upcasting,因为不是虚函数,所以调用父类函数。 }
运行结果:instrument::play
//: WIND3.CPP -- Late binding with virtual #include <iostream.h> enum note { middleC, Csharp, Cflat }; // Etc. class instrument { public: virtual void play(note) const { // 虚函数 cout << "instrument::play" << endl; } }; // Wind objects are instruments // because they have the same interface: class wind : public instrument { public: // Redefine interface function: void play(note) const { cout << "wind::play" << endl; } }; void tune(instrument& i) { // ... i.play(middleC); } main() { wind flute; tune(flute); // 可以传递子类,但做了向上转换Upcasting,因为是虚函数,所以调用子类函数。 }
运行结果:wind::play
//: SLICE.CPP -- Object slicing #include <iostream.h> class base { int i; public: base(int I = 0) : i(I) {} virtual int sum() const { return i; } }; class derived : public base { int j; public: derived(int I = 0, int J = 0) : base(I), j(J) {} int sum() const { return base::sum() + j; } }; void call(base b) { cout << "sum = " << b.sum() << endl; } main() { base b(10); derived d(21, 47); call(b); call(d); // 产生切片以后,就算是调用虚函数也没有用,仍然使用父类的函数进行计算,计算的时候当然使用父类的数据成员 }
输出结果:
sum = 10
sum = 21
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。