【问题标题】:pure virtual function in a c++builder TFramec++builder TFrame中的纯虚函数
【发布时间】:2021-09-04 22:57:06
【问题描述】:

C++Builder 10.4.2

我创建了一个带有纯虚函数的 TFrame。然后从那个 TFrame 派生出另一个 TFrame,但没有覆盖基类虚函数。

我希望得到编译器错误,但没有。

该行为是否未在 VCL 类中实现?

这是代码:

// create a frame from File/New..., add a pure virtual function
class TFrame4 : public TFrame
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
    __fastcall TFrame4(TComponent* Owner);

    virtual void func() = 0;
};
extern PACKAGE TFrame4 *Frame4;

// derive a frame from it, put it on the main form. compile/run 
without error
class TFrame5 : public TFrame4
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
    __fastcall TFrame5(TComponent* Owner);
};
extern PACKAGE TFrame5 *Frame5;

【问题讨论】:

标签: function c++builder virtual


【解决方案1】:

这是因为 TFrame 是由用 Delphi 编写的 VCL 框架创建的。所以该对象永远不会满足 C++ 'new' 关键字。

尝试创建一个“虚拟”对象,隔离在单独的命名空间中。这个对象永远不会真正被创建,但它足以触发 C++ 编译器测试以具体使用抽象类。

例如:

namespace Test {
    // this will never really created
    new TFrame5( nullptr ); // <- should trigger an error
}

另见:

https://quality.embarcadero.com/browse/RSP-28329

问候

【讨论】:

  • 如果您使用 IDE 的向导在 C++Builder 中创建一个新组件,生成的骨架代码实际上包含这样一个“新”语句以避免抽象组件。但是,如果您手动编写自己的派生类,则需要手动创建此类语句。
  • 这是我告诉他的。
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 2016-07-22
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2020-08-21
相关资源
最近更新 更多