• inherited 为什么可以调用父类的private函数? [问题点数:100分,结帖人:h2plus0]


    http://topic.csdn.net/t/20050507/00/3986446.html

    发表于:2005-05-07 00:21:04 楼主

    例如, 下面的代码表示 子类可以用inherited 调用 父类的private方法,

    (另外, TCustomTreeView.CMCtl3DChanged() 也调用了 TWinControl 的private方法 CMCtl3DChanged() )

        TBase   =   class
        private
            procedure   a();virtual;
        end;
    
    
        TDerive=class(TBase)
        public
            procedure   a();override;
        end;
    
    {   TBase   }
    
    procedure   TBase.a;
    begin
        writeln( 'base.a() ');
    end;
    
    {   TDerive   }
    procedure   TDerive.a;
    begin
        writeln( 'derive   a() ');
        inherited;
    end;
    
    

    现在我想把上面代码转成c++代码,   该如何转呢?   (下面的编译过不了啊,
    [C++   Error]   Unit1.cpp(30):   E2247   'TBase::a() '   is   not   accessible   )

    class   TBase
    {
    private:
        virtual   void   a();
    };
    
    
    class   TDerive:   TBase
    {
    public:
        virtual   void   a();
    };
    
    
    void   TBase::a()
    {
        cout < < "base.a() " < <endl;
    }
    
    void   TDerive::a()
    {
        cout < < "derive.a() " < <endl;
        TBase::a();
    }
    
    
    

    回复于:2005-05-07 07:51:04                                         #3楼 得分:18

    要么把那个private改为Protected,这样就可以继承了

    delphi的这种用inherited可以实现子类调用父类private方法,是由于两个类都在同一个单元中,可以任意访问对方的Private成员。

    回复于:2005-05-07 10:17:11                                           #6楼 得分:10

    你要想让子类继承父类的方法,可以声明为protected。这样才能继承。

    回复于:2005-05-07 12:31:13                                            #7楼 得分:10

    在Delphi中放在同一个Unit中的类是可以调用其私有方法的,这就像C++中的友元一样,你要转换成C++只能用友元,或改变为protected

    回复于:2005-05-07 15:25:07                                           #8楼 得分:12

    同意楼上。
    在delphi中封装只在不同单元才起作用。在同一单元,私有、保护、公有和公布成员均具有一样的访问权限。如果适当利用这一特点,如创建一个没有任何成员的类,可让你访问另一单元的保护成员。

    回复于:2005-05-07 17:06:18                                              #10楼 得分:8

    delphi处理友员函数,或者友员类就是这样的,建议把class分单元unit编写开发

    CStudent:public   CRen;
    {
        friend   void   ParentFunction(void);...
    }

    回复于:2005-05-08 00:19:01                                              #13楼 得分:           

    问题好像找到答案了,对于delphi   中用   message   定义的这种函数,可以转换成下面cb代码,


            MESSAGE   void   __fastcall   CMMouseLeave(TMessage   &Msg);

            BEGIN_MESSAGE_MAP
                    VCL_MESSAGE_HANDLER(CM_MOUSELEAVE,   TMessage,   CMMouseLeave)
            END_MESSAGE_MAP(TClassThatYouAreDerivingFrom)

            void   __fastcall   TYourComponent::CMMouseLeave(TMessage   &Msg)
            {
                    //...
                    Dispatch(&Msg);         //   Delphi   inherited  
            }

    所以发现   inherited   在   message定义的函数中使用的其实不同于一般的函数,由于是通过TObject
    的Dispatch()   调用的,   所以是   private   的也可以,   即使在不同的Unit中。

    谢谢大家的帮助!

    回复于:2005-05-08 00:33:54                                                         #14楼 得分:18

    刚才看了代码,其实TCustomTreeView.CMCtl3DChanged()是Message方法,要特殊对待,inherited表示根据消息ID按类层次向后查找具有相同消息ID的第一个Message方法,并且Message方法都会在private声明。
    如果子类和父类不在同一单元,子类是不可以继承父类的private方法的,因为父类的private方法对子类来说是不可见的,

  • 相关阅读:
    SpringBoot系列: Pebble模板引擎语法介绍
    SpringBoot系列: Pebble模板引擎
    SpringBoot系列: CommandLineRunner接口的用处
    SpringBoot系列: 设计Restful风格的API
    SpringBoot系列: 所有配置属性和官方文档
    Spring Security 之API 项目安全验证(基于basic-authentication)
    Spring Security 之方法级的安全管控
    SpringBoot系列: 使用 Swagger 生成 API 文档
    SpringBoot系列: Web应用鉴权思路
    SpringBoot系列: RestTemplate 快速入门
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/1847994.html
Copyright © 2020-2023  润新知