抽象接口继承

时间:2013-03-05 11:57:32

标签: c++

必须始终在派生类中实现虚方法吗?
我能写这样的东西吗?

<!-- 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

3 个答案:

答案 0 :(得分:0)

  

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

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

在您的代码中,您没有从Derived创建对象,所以没关系。

  

我可以写这样的东西吗?

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

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();
}

答案 1 :(得分:0)

它使Derived也是一个你无法实例化的抽象类,看到你没有从它的基础实现所有virtual函数,它就变成了一个你无法直接实例化的抽象类。

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

对于其他人,您的代码应该有效。

答案 2 :(得分:0)

代码是正确的。 C ++中的 interface 没有特殊的概念。所有都是课程。一些类方法可以是纯虚方法。它只意味着编译器无法创建此类的实例。