C++继承与派生,虚函数与多态

假设定义了以下的基类和派生类:

class shape
{
    public:
    shape(int a){};             //基类构造
    int length(){};             //基类中与子类重名函数
    void display(){};           //基类中独有
    vitual int area(){};        //基类中虚函数
}

class rectangle:public shape
{
    public:
    rectangle(int);
    int length();
    int area();

}

1. 派生类的定义

rectangle::rectangle(int a):shape(int a){};     //派生类中使用基类构造函数
void rectangle::length()
{
    shape::length();                            //派生类中使用重名的父类函数
    display();                                  //派生类中使用父类中独有函数
}

2. 派生类实例的使用

rectangle rect();
shape theshape();
rect.length();          //调用rectangle::length()
rect.shape::length();   //显式指定调用基类函数shape::length()
rect.display();         //display()被继承,调用shape::display()

3. 对象的成员变量与成员函数的不同

成员变量在对象初始化之后,仍然可以进行赋值,更改。事实上,对对象的任何操作,也仅仅是对它的成员变量进行操作。
成员函数在对象初始化那一刻使确定下来,成员函数是根据该对象的类型进行绑定的,是编译期已经确定的,静态绑定。

各个实例的成员变量的地址是不同的,与实例的首地址有关。
各个实例的成员函数其实是共用的,因为只与他们的类型相关。

成员变量的地址(包括虚表变量)是按照各实例的首地址给的,各实例之间不相同。
成员函数的地址是按照实例的类型给的,各实例间相同。

4. 类型的转换

要区分对象的类型转换对象指针的类型转换:

  1. 实际上,指针的类型可以任意转换,只是指针指向的地址发生变化而已。
  2. 对象的类型转换,实际上是将右值的所有成员变量的值赋给左值。注意:右值的虚表变量不会赋值给左值!
  3. 就地转换,实际上是隐含地调用了一次转换后类型的构造函数,产生了一个临时对象,将这个临时对象作为左值。

    rectangle rect;
    shape shp;
    shp = (shape)rect;          //合法,将rect中与shp相同的那部分成员变量赋给shp
                                //等价于 shp.a = rect.a, shp.b = rect.b
                                // shp.vtable并没有被rect.vtable覆盖! 仍然是原来的。

    rect = (rectangle)shp;      //不合法,因为rect的一些成员变量,shp并没有,所以赋值时要出错
                                //rect.a  = shp.a, rect.b = shp.b,rect.c = shp.?
    rectangle* prect;
    shape* pshp;
    pshp = ▭               //pshp指向了rect的首地址
                                //pshp指向的成员变量是rect的成员变量
                                //(pshp可以指向一些shape类型没有的成员变量)
                                // 但pshp绑定的成员函数还是shape类型的成员函数。
                                //pshp->vtable就是rect.vtable, 但pshp->length()调用的是 shape::length();
    prect = &shp;        //合法,但是没有实际意义

5. 虚成员函数与普通成员函数

上面已提了,一个实例的普通成员函数在编译期已经根据它的类型确实了。而虚函数不是这样的,它的调用是根椐实例的成员变量虚表查到的。

rectangle rect;
shape shp;
shp.area();                 //其实是shp.vtable->area();
rect.area();                //rect.vtable->area();

shape* pshp;
pshp = ▭
pshp->area();               //实际上是pshp->vtable->area(),而pshp->vtable == rect.vtable,所以调用的是 rectangle::area();
pshp->length();             //length是普通的成员函数,根据pshp的类型确定,所以调用的是shape::length();


((shape)rect).area();       //就地转换并调用,相当于下面的的两行代码
shape shp2 = rect;
shp2.area();                //shp2的成员变量被rect的成员变量覆盖,但shp2.vtable并没有变成rect.vtable,仍然调用shape::area();

6. 虚函数的用途:统一形式的调用

shape* pshps = [&triangle(), &rectangel()];
for(auto ipshp: pshps)
    ipshp->area();          //分别调用了各个不同类型实例的area();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容