2013-03-05 125 views
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

+0

看看这个例子:http://liveworkspace.org/code/6huYU$8它似乎工作。 – 2013-03-05 12:02:07

+0

什么是不工作是这样的:http://liveworkspace.org/code/6huYU$10 – 2013-03-05 12:03:36

+0

试试看看。 – 2013-03-05 12:14:19

回答

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

devied班?或者你的意思是派生类。 – DeadWarlock 2013-03-05 12:06:52

+0

@DeadWarlock:派生的。错字。 – deepmax 2013-03-05 12:10:32

0

它使Derived还你不能实例化了,因为你没有实现所有virtual功能,从它的基础的抽象类,它成为一个抽象类不能直接实例化。

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

对于剩下的,你的代码应该工作。

0

代码无误。 在C++中,接口没有特殊的概念。所有都是课程。一些类的方法可以是纯虚拟的。它只意味着编译器不能创建这样的类的实例。