我对 c++ 纯虚函数和接口的误解
Something I misunderstand with c++ pure virtual function and interfaces
我喜欢在几个类中定义良好的接口,为此,我在抽象类中创建了纯虚函数,每个类都需要实现。
但是我面临的问题是我可以实例化类,所以我必须创建另一个继承接口类的类,而所有其他类都需要从这个基类继承。下面是代码示例:
界面
class Interface
{
virtual std::string getName() = 0;
}
class Base : public Interface
{
virtual std::string getName(return std::string("Base") ;)
}
class A : public Base
{
std::string getName(return std::string("A") ;)
}
class B : public Base
{
std::string getName(return std::string("B") ;)
}
所有这些,所以我可以在代码中为 A 和 B 使用相同的类型。
我可以只使用 Interface
类而不使用 Base
类吗?
像这样:
class A : public Interface
{
std::string getName(return std::string("A") ;)
}
不,他们没有。所有从接口(直接或间接)继承的类都必须在继承树中的某处实现纯virtual
函数才能实例化。
因此,您可以在基类或顶级类中实现该方法。
此外,您的语法也相差甚远:
class A : public Interface
{
std::string getName()
{
return std::string("A");
}
};
即使它不是从Base
派生的,上面的方法也应该有效,因为你从Interface
实现了纯虚方法。
建议 - 使您的getName
方法const
。
你不能实例化接口,但你可以做的是有一个指向接口的指针,指向一个实现的实例:
class Interface { /* pure virtual methods */ };
class A : virtual public Interface { /* implement all pure virtual methods */ };
class B : virtual public Interface { /* implement all pure virtual methods */ };
Interface * i0 = new A();
Interface * i1 = new B();
这是使用多态类的标准方法(尽管您可能希望使用智能指针而不是原始指针)。
编辑:关于虚拟继承的使用,有关更多信息,请参阅此处和此处。
如果基类具有纯虚函数,则无法创建基类的实例,因为它是抽象基类。如果你需要能够实例化这个类,其中没有任何纯虚函数。否则,只需从中得出。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- #if 如何工作?我误解了 #if~#endif 的形式吗?
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 我对 c++ 纯虚函数和接口的误解