【问题标题】:Implement abstract methods from inherited class从继承的类中实现抽象方法
【发布时间】:2013-08-25 17:17:01
【问题描述】:

我正在尝试做一些我以前从未真正做过的事情。我基本上有3节课。 A类是具有纯虚拟方法的抽象类,B类是它自己的类,其中包含与A类中的虚拟方法同名的方法。我试图将C类中的所有内容联系在一起。我想在 C 中继承 B 类和 A 类(多重继承),并使用 B 类中的方法来实现 A 类中的方法。这样我创建了一个模块化方法。下面的示例是我的代码的一个非常简化的版本。

class A {
virtual int methodA() = 0;
virtual int methodB() = 0;
virtual int methodC() = 0;
};

class B { //B implements A.A() and A.B()
int methodA() { return 0; }; 
int methodB() { return 0; };
};

class C : A, B {
int methodC() { return 0; }; //C implements A.C()
};

我可以编译 C 类,但是当我尝试构造一个 C 类 new C() 时,我收到一条编译器消息,提示 “由于以下成员,无法实例化抽象类:int methodA()' : is abstract” em>。

有没有办法通过 C 类中的多重继承来使用 B 类来实现 A 类?

编辑:希望保持 B 类具体。

【问题讨论】:

  • B 直接实现这些方法似乎有什么问题?
  • @MarkB 我希望 B 可重用。 A 类包含在 C 类中实现的方法。
  • 如果你真的想这样做,你可以为 B 实现一个虚拟方法。我说“如果你真的想”的唯一原因是因为这没有很好的“代码味道” 。”也许你可以多解释一下你要解决的真正问题,这里有人可以给你一个替代的实现。
  • 顺便说一句,我不是要拒绝你。让 B 部分实现 A 的接口,然后让 C 完成它,这很奇怪。如果您将接口视为与使用它的客户端代码的合同,那么 B 违反了对客户端代码的相当重大的承诺。即它有一些操作方法C.在必须以这种方式实现的情况下,B 至少应该对方法 C 有一些“空”效果。
  • @DubiousPusher 在下面对 TemplateRex 的评论中,我有一个由 B 类实现的接口,但对继承接口 IUnknown 有严格要求,其中包含标准的抽象方法,必须实现。为了模块化我的代码,我想创建一个类似于 B 类的类,它是具体的,并且可以在未来的任何代码源中重用。除了接口 IUnknown 是在接口定义语言文件中定义的,我认为它不存在 c++ 样式定义。

标签: c++ abstract-class multiple-inheritance virtual-functions name-hiding


【解决方案1】:

您可以通过一些方法的样板来做到这一点。

class A {
public:
virtual int methodA() = 0;
virtual int methodB() = 0;
virtual int methodC() = 0;
};

class B { //B implements A.A() and A.B()
public:
int methodA() { return 0; }; 
int methodB() { return 0; };
};

class C : public A, public B {
public:
int methodA() { return B::methodA(); }
int methodB() { return B::methodB(); }
int methodC() { return 0; }; //C implements A.C()
};

演示:http://ideone.com/XDKDW9

【讨论】:

  • B 并不是一个基类(初学者没有虚拟析构函数)
  • @TemplateRex 我认为你可以通过对B 使用私有继承来解决这个问题。
  • 我认为OP的一般设计完全是fubar,通过滥用继承来节省重新键入2种方法的实现只是不好的做法。
  • @TemplateRex 我并不是说这一定是个好主意;如果实现类使用不同的方法名会更简洁。但是 mixin 类的想法可能非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多