effective c++ 记录之对象切割问题

时间:2022-09-06 11:23:01

今天看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,也从另一方面说了它不是动态绑定)。