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