今天看effective c++ 发现里面有句话不太理解"造成此对象的行为像个derived class对象"的那些特化性质全被切割掉了,仅仅留下一个base class对象"
总感觉这话听起来特别拗口,于是在程序里面大致实现了下
window:父类
window_son:子类
代码如下:
window.h
</pre><pre name="code" class="html">#pragma once #include <stdio.h> #include <iostream> #include <string> using namespace std; class window { public: window(string str); string name(); virtual string ShowWindow(); ~window(void); string str2; };window.cpp
#include "window.h" window::window(string str) { str2 = "window"; } window::~window(void) { } string window::name() { string str1; str1 = "this is "+str2; return str1; } string window::ShowWindow() { string str; str = "show "+str2;// str = "show window" return str; }
window_son.h
#pragma once #include "window.h" class window_son : public window { public: window_son(string str); ~window_son(void); virtual string ShowWindow(); };
window_son.cpp
#include "window_son.h" window_son::window_son(string str):window("window") { str2 = "window_son"; } window_son::~window_son(void) { } string window_son::ShowWindow() { string str; str = "show "+str2;//str = "show window_son" return str; }main
#include "window.h" #include "window_son.h" string getW(window w) { return w.name();//return w.ShowWindow(); } void main() { window_son ws("son"); cout<<getW(ws)<<endl; system("pause"); }
注意变量string str2.
虽然最终打印出来的是 this is window_son
但是其实还是调用的window中的函数name 而不是window_son继承过来的name
因为我们如果使用注释中的代码,会发现打印出来的是 "show window" 而不是"show window_son"
所以effective c++这本书中所谓的特化性质就是这个虚函数(动态绑定啊,没有使用绑定到子类中的函数)
而之前未注的代码 之所以打印出this is window_son是因为那个关键的继承变量str2. 也正因为他的非动态绑定(我想就算是切割,他本质也是window_son中的存储结构,故依然调用的是window_son中的str2,也从另一方面说了它不是动态绑定)。