我喜欢在几个类中定义良好的接口,为此,我在每个类需要实现的抽象类中创建了纯虚函数。 但我面临的问题是我可以实例化类,所以我必须创建另一个继承接口类的类,所有其他类都需要从这个基类继承。以下是代码:
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") ;)
}
答案 0 :(得分:6)
不,他们没有。从接口继承(直接或间接)的所有类必须在继承树中的某处实现纯virtual
函数才能实例化。
因此,您可以在基类或顶级类中实现该方法。
此外,您的语法很接近:
class A : public Interface
{
std::string getName()
{
return std::string("A");
}
};
上述内容应该有效,即使它不是来自Base
,因为您从Interface
实现了纯虚方法。
建议 - 制作getName
方法const
。
答案 1 :(得分:4)
你不能实例化接口,但你可以做的是有一个指向接口的指针,指向一个实现的实例:
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();
这是使用多态类的标准方法(尽管您可能希望使用smart pointers而不是原始指针)。
答案 2 :(得分:0)
如果它具有纯虚函数,则无法创建基类的实例,因为它是抽象基类。如果您需要能够实例化此类,则其中没有任何纯虚函数。否则只是从中得出。