首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象接口继承

抽象接口继承
EN

Stack Overflow用户
提问于 2013-03-05 19:57:32
回答 3查看 94关注 0票数 1

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

我能写这样的东西吗?

代码语言:javascript
复制
<!-- 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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-05 20:02:51

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

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

在您的代码中,您没有从Derived创建对象,所以这是可以的。

我能写这样的东西吗?

是。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-05 20:06:28

它使Derived成为一个不能实例化的抽象类,因为您没有从它的基础实现所有的virtual函数,所以它变成了一个不能直接实例化的抽象类。

查看此处: liveworkspace.org/code/6huYU$10

对于其余部分,您的代码应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2013-03-05 20:09:40

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15223192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档