我有一个TRttiProperty
名为的变量aRttiProperty
,它指向下面的属性:
Tsubscription = class(TMyObject)
private
fBilling: TMyObject;
public
property billing: TMyObject read fBilling; // << aRttiProperty point to this member
end;
Run Code Online (Sandbox Code Playgroud)
现在,我如何从中提取fBilling
对象指针aRttiProperty
?
我尝试这样做,但无法正常工作:
function Tsubscription.getfBillingObj(const aRttiProperty: TRttiProperty): TMyObject
begin
Result := aRttiProperty.GetValue(Self).AsType<TMyObject>;
end;
Run Code Online (Sandbox Code Playgroud)
它返回父TSubscription
对象而不是fbilling
字段对象。
使用RTTI(通过使用typeid
和dynamic_cast
)几乎被普遍认为是糟糕的编程实践.
类似地,定义一个所有派生必须通过虚函数返回的类型标记也被认为是不好的做法,例如:
enum Type {
DERIVED_1,
DERIVED_2
};
class Base {
virtual Type type() = 0;
};
class Derived1 : public Base {
Type type() override {
return DERIVED_1;
}
};
class Derived2 : public Base {
Type type() override {
return DERIVED_2;
}
};
Run Code Online (Sandbox Code Playgroud)
但是,有时我需要区分不同的派生类,比如当我有一个指针时Base
可能是Derived1
或者Derived2
:
Base *b = new Derived2();
// Approach 1:
if (typeid(*b) == typeid(Derived1)) {
std::cout << "I have a Derived1.\n";
} else if (typeid(*b) == …
Run Code Online (Sandbox Code Playgroud) 我动态地在表单对象上添加了组件
Edit1 := TEdit.Create(form3);
Run Code Online (Sandbox Code Playgroud)
我有Tform类的对象form3.现在我想要做的是我想创建一个form3的组件模板,这样我就可以将该组件模板拖放到我的任何其他组件上,并且它中的所有组件将自动供我使用.任何人都可以帮助我如何做组件模板?
据我所知,当基类具有虚函数时,C ++可以获取对象动态类型的准确信息。
class Base
{
public:
Base() {}
~Base() { std::cout << "Base Destructed" << std::endl; }
virtual void f() {}
};
class Derived : public Base
{
public:
Derived() {}
~Derived() { std::cout << "Derived Destructed" << std::endl; }
};
void PrintTypeName(Base *p)
{
std::cout << typeid(*p).name() << std::endl;
}
int main()
{
Base *p = new Derived();
PrintTypeName(p);
delete p;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以打印正确的对象类型,但是为什么它不能调用正确的析构函数。
我在g ++和Windows编译器上对其进行了测试,它们给出了相同的结果。我知道如果我使Base析构函数virtual
,它可以正确地分解。
但是我想知道为什么不通过调用析构函数typeid
。
我需要更改通过Controls
容器控件的属性收集的控件的 FONT 属性:
for i := 0 to ContainerControl.ControlCount - 1 do
begin
ContainerControl.Controls[i].Font.Size := 8; // error
end;
Run Code Online (Sandbox Code Playgroud)
为此,我需要类型转换ContainerControl.Controls[i]
为具有 FONT 属性的 TWinControl 类。有这样的班级吗?或者我如何检测特定的 TWinControl 是否具有 FONT 属性?或者如何将特定 TWincontrol 类型转换为特定其他 TWinControl 的类型?