C ++:共同的祖先和接口/原型是C ++类的互斥功能吗?

时间:2016-07-04 21:59:31

标签: c++ interface prototype ancestor

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

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的功能合并到一个类中? (我相信由于MyInterface是ABC,我不能将此类型用作fxn_or_method_using的参数。)

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

没有。您可以在C ++中使用同一个类混合虚拟和纯虚拟以及具体继承,而不会出现任何问题。

class baseClass{

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

  virtual blah3() = 0;

};

class derivedClass : baseClass
{


};