构造函数 Delphi -> C++Builder。(200分)

  • 主题发起人 主题发起人 Croco
  • 开始时间 开始时间
C

Croco

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi 中,先执行一些代码,然后继承父类的构造函数。
constructor TTest.Create

begin
......
inherited Create;
end;

C++Builder 何以实现同样功能?
__fastcall TTest::TTest(void)
{
...
???? <----
}
 
假设TTest的父类是TTestParent

则:
__fastcall TTest::TTest(void)
{
...
TTestParent::Create()
<----
}
 
对不起:
TTestParent::TTestParent()
<----

:-)
 
又是温柔老兄,
麻烦是:子类的构造函数会隐含先调用父类的构造函数。
执行时是这样的:
__fastcall TTest::TTest(void)
{
//TTestParent::TTestParent()
<---可恶!!!
...
TTestParent::TTestParent();
}

另,BCB 子类的析构函数则在析构子类之后隐含调用父类的析构函数。
__fastcall TTest::~TTest(void)
{
...
//TTestParent::~TTestParent()

}
有没有办法?
用 Delphi 真是方便极了。:-)
 
或者我上面一层的说法是错的。
父类是TList。
 
如果是VCL的子类,应该和Delphi一样,
如果是纯粹C++类,应该是隐含调用父类constructor。

你试验一下,有什么结果告诉我,因为我一下记不清了,
 
恐怕得定做一个编译器。
 
另外,你的TTest::TTest是不是定义为:

class TTest public TTestParent
{
TTest(): TTestParent(){...}
...
}

如果是这样,当然先调用TTestParent()了,
否则应该如我上面所说。
 
C++类
class TSon: public TFather
{
public:
__fastcall TSon(void);
};
__fastcall TSon:TSon(void);
即是隐含调用……

VCL的子类
class TTestButton: public TButton
{
public:
__fastcall TTestButton(TComponent* Owner);
};
又不得不按如下方法定义,也是隐含调用……
__fastcall TTestButton::TTestButton(TComponent* Owner) : TButton(Owner)
否则
__fastcall TTestButton::TTestButton(TComponent* Owner)
出错:cannot find default constructor to initialize base class TButton.

看来在构造函数中无法在构造子类之后在构造父类了。
温柔兄再想想看有什么招--
 
Delphi的控件不是可以在C++ Builder中引用吗?
做完Delphi控件,再放到CB中?
 
to Croco:

看来我的记性还不错 :-)

纯C++类不可能,这是肯定的了;
VCL的类是否可以使用变通方法:
__fastcall TTestButton::TTestButton(TComponent* Owner) : TObject();
{
...
TButton::Button(Owner)
}
只使用TObject的构造函数作为缺省constructor,然后在某一时刻再调用TButton,
这样是否可以,需要你试验。(个人感觉这种方法危险,不推荐)

另一种办法比较复杂,而且需要仔细的设计,即:
在父类的constructor中的适当位置调用一个方法,子类通过重载这个方法,
实现在父类的constructor中被调用,这样子类的constructor就不需要写
在父类的constructor“之前”被调用的内容了。当然,这对不是你写的
父类是无效的,例如TButton :-)
 
如果无法方便地在构造子类之后再构造父类,温柔的回答可以满意。
Thanks!
 
>>如果无法方便地在构造子类之后再构造父类

确切地说是“无法方便地在调用子类构造函数之后再调用父类构造函数”
这还是有一点细微差别的,当然主要是词汇问题。

其实我又想了一下,Delphi的机制就相当于我说的第一种方法,并非不可能,
因此,你还没告诉我我说的第一种方法在BCB中试验的结果呢!
希望你告知一下 -- 我实在很忙,又很懒 :-)

另外,你看过我给soul的那篇贴子?不然怎么那么准,给了我一个带8的分数呢?
(看到自己的分数又变成“整数”,心里乐开了花...)
 
后退
顶部