1

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

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

4

3 回答 3

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();
}
于 2013-03-05T12:02:51.000 回答
0

它还创建Derived了一个您无法实例化的抽象类,因为您没有virtual从它的基础中实现所有功能,它变成了一个您无法直接实例化的抽象类。

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

其余的,您的代码应该可以工作。

于 2013-03-05T12:06:27.950 回答
0

代码是正确的。C++中没有接口的特殊概念。都是类。一些类方法可以是纯虚拟的。这仅意味着编译器无法创建此类的实例。

于 2013-03-05T12:09:39.847 回答