0

在 C++ 中,继承一个共同的祖先和继承一个接口(并且需要在派生类中定义一个方法)是否需要多重继承?例如。我是否必须执行以下操作(而不是合并MyInterfaceand ParentClass):

class MyInterface;
class ParentClass;
class DerivedClass1;
class DerivedClass2;
class SomeOtherType;
class YetAnotherType;

class MyInterface {
  public:
    //  Must be defined in all derived classes
    virtual SomeOtherType my_common_fxn(...) = 0;
    ...
};

class ParentClass {
  private:
    //  Common ancestor
    YetAnotherType _useful_member;
}

class DerivedClass1 : MyInterface, ParentClass {
  public:
    // Do some things with _useful_member, using approach #1
    SomeOtherType my_common_fxn(...);
    ...
}

class DerivedClass2 : MyInterface, ParentClass {
  public:
    // Do some things with _useful_member, using approach #2
    SomeOtherType my_common_fxn(...);
    ...
}

void fxn_or_method_using(ParentClass);

是否可以(优雅地)将和的功能合并MyInterfaceParentClass一个类中?(我相信作为MyInterfaceABC 我不能使用这种类型作为参数fxn_or_method_using。)

如果这是重复的,请提前道歉-我已经搜索过,但现有的 C++ 问题似乎都没有出现。Q 和/或 A 可能已经超出了我(未经训练的)的头脑。

4

2 回答 2

2

您的继承模型没有任何问题。

但是在 C++ 中,您需要一个指针或引用来实现多态性。您fxn_or_method_using按值获取其参数。这有几个问题。它会导致切片,它会阻止多态函数调用,并且它不能用于抽象类型,因为你不能创建它们的实例。

如果您更改fxn_or_method_using为通过引用而不是值来获取其参数,那么您可以根据需要将其声明为引用MyInterface。所有的缺点都消失了,你得到了你想要的多态行为。

于 2016-07-08T04:34:33.533 回答
0

不,您可以在 C++ 中混合来自同一个类的虚拟和纯虚拟和具体继承,没有任何问题。

class baseClass{

public:
  blah1(){
  //stuff
}
  virtual blah2();

  virtual blah3() = 0;

};

class derivedClass : baseClass
{


};
于 2016-07-05T00:06:22.207 回答