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
相关产品推荐
相关产品推荐

