You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何实例化无显式/隐式构造函数的类?

关于Foo类无法直接实例化的问题

你没法直接执行auto ptrFoo = new Foo的核心原因不是Foo没有构造函数,而是Foo是包含纯虚函数的抽象类,C++语法规定抽象类本身不允许被实例化。
当前你看到的Foo继承自IFoo,没有实现IFoo定义的纯虚函数GetWidth,自身还新增了纯虚函数GetBar,只要类中存在未实现的纯虚函数,它就是抽象类。哪怕编译器会为它生成隐式的默认构造函数,你也无法调用该构造函数直接创建Foo的实例。

阻止默认构造函数被调用的常见方式

除了你知道的把构造函数设为protected成员之外,还有两种常见实现:

  • 把构造函数声明为private,仅允许类自身或友元调用,这类非公开的声明不会出现在你拿到的头文件的公开定义区域
  • C++11及之后的标准支持直接显式删除默认构造函数:Foo() = delete;

但在你当前的场景中不需要做额外的阻止操作,Foo作为抽象类本身就天然禁止外部直接实例化,已经达到了阻止默认构造函数被外部调用的效果。

Bar创建Foo实例的实现逻辑

你的猜测是正确的,这是C++领域非常常用的接口与实现分离的设计思路,常用来隐藏内部实现、保证ABI兼容性。
具体实现逻辑为:Bar的实现文件Bar.cpp内部会定义一个非公开的Foo的子类,例如命名为FooImpl,这个子类会实现IFoo和Foo中定义的所有纯虚函数,是可以被实例化的具体类。
Bar内部创建的是FooImpl的实例并持有它的指针,调用GetFoo()方法时会把FooImpl*向上转型为Foo*返回给调用方,你作为调用方只需要通过Foo提供的虚函数接口操作实例即可,不需要感知具体的实现类细节。

内容的提问来源于stack exchange,提问作者JaeMin Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:03