抽象接口继承

Abstract interface inheritance

本文关键字:继承 接口 抽象      更新时间:2023-10-16

必须始终在派生类中实现虚拟方法吗?
我可以这样写吗?

<!-- language: lang-cpp -->
class BaseInterface 
{
public:
   virtual void fun_a() = 0;
   virtual void fun_b() = 0;
   virtual ~BaseInterface(); 
};
class Derived : public BaseInterface
{
   void fun_a() { ... };
};
class FinalClass : public Derived
{
   void fun_b() { ... };
}
int main()
{
   FinalClass test_obj;
   test_obj.fun_a();  // use Derived implementation or fail ???
   test_obj.fun_b();  // use own implementation 
   BaseInterface* test_interface = new FinalClass();
   test_interface->fun_a(); // fail or ok ???
   test_interface->fun_b(); 
}

上面的代码正确吗?
是否存在其他虚方法outflank ?

纯虚方法总是必须在派生类中重新实现吗?

实际上是一个将要被实例化的派生类

在你的代码中,你没有从Derived中创建一个对象,所以它是OK的。

我可以这样写吗?

是的。

你有一些小错误,我纠正了它们:

class BaseInterface
{
public:
    virtual void fun_a() = 0;
    virtual void fun_b() = 0;
    virtual ~BaseInterface() {};  // You forget this
};
class Derived : public BaseInterface
{
public:
    void fun_a() {}  // This should be public as its base
};
class FinalClass : public Derived
{
public:
    void fun_b() {} // This should be public as its base
};
int main()
{
    FinalClass test_obj;
    test_obj.fun_a();
    test_obj.fun_b();
    BaseInterface* test_interface = new FinalClass();
    test_interface->fun_a();
    test_interface->fun_b();
}

这使得Derived也是一个抽象类,你不能实例化,看到你不从它的基实现所有的virtual函数,它成为一个抽象类,你不能直接实例化。

请看这里:liveworkspace.org/code/6huYU$10

代码正确。c++中没有接口的特殊概念。都是类。有些类方法可以是纯虚的。它只意味着编译器不能创建这样一个类的实例。