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方法对子类来说是不可见的,

原文地址:https://www.cnblogs.com/chulia20002001/p/1847994.html