大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
overload
重载,在同一个类中,函数名相同,参数不同,与virtual和返回值无关。

override
覆盖,重写,在继承关系的类中,函数名相同,参数相同,有virtual关键字,返回值必须相同。

hide
隐藏,用子类对象无法调用父类。
函数在继承关系的类中,函数名相同,参数不同,不管有没有virtual,父类函数都被hide
                                                                  参数相同,无virtual,父类函数被hide。


  同参,有virtual 同参,无virtual 不同参,与virtual无关
基类指针指向子类对象 override,调用子类函数,多态 调用父类函数,静态类型调用 调用父类函数OK,静态类型调用
调用子类函数出错,基类中没有该函数
子类对象 调用子类函数,静态类型调用 调用子类函数,无法调用父类同名函数,hide 调用父类函数出错, hide
调用子类函数OK,静态类型调用


如下示例中,当用子类对象调用函数时,注释掉的部分是调用父类函数出错的hide,还有调用子类函数的hide。
用基类引用调用函数时,注释掉的部分是子类特有函数,基类引用识别不了。
#include <iostream>

using namespace std;


class A {
public:
            
void a    ()                {cout<<"A::a()"<<endl;}
            
void a    (int)            {cout<<"A::a(int)"<<endl;}                
    
virtual void b    ()                {cout<<"A::b()"<<endl;}
    
virtual void b    (int)            {cout<<"A::b(int)"<<endl;}                
    
virtual void d    (int i = 10)    {cout<<"A.d:"<<i<<endl;}
}
;

class B: public A {
public:
            
void a    ()                {cout<<"B::a()"<<endl;}                 
            
void a  (intint)        {cout<<"B::a(int, int)"<<endl;}                                                                                
            
void b    ()                {cout<<"B::b()"<<endl;}                 
            
void b    (intint)        {cout<<"B::(int, int)"<<endl;}          
            
void c    ()                {cout<<"B.c"<<endl;}
            
void d    (int i = 20)    {cout<<"B.d:"<<i<<endl;}
}
;

int main()
{
    B b;
    b.a();                
//hide,调用的是B的a
//    b.a(1);                //非法,B中的a将A中的a全部hide了,与参数和virtual关键字无关
    b.a(1,1);            //静态类型,调用的是B的函数
    b.b();                //hide,调用的是B的b
//    b.b(1);                //非法,B中的b将A中的a全部hide了,与参数和virtual关键字无关
    b.b(1,1);            //静态类型,调用的是B的函数

    A
& rb = b;
    rb.a();                
//静态类型,调用的是A的函数
    rb.a(1);            //静态类型,调用的是A的函数
//    rb.a(1,1);            //非法,B中的overload,B特有的函数,A里没有定义
    rb.b();                //override,有virtual关键字,名字和参数相同
    rb.b(1);            //没有override,调用的是A的函数
//    rb.b(1,1);            //非法,B中的overload,B特有的函数,A里没有定义
    return 0;
}


posted on 2009-06-11 21:42 大胖 阅读(457) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理