C ++: Являются ли общие предки и интерфейс / прототип взаимоисключающими функциями класса C ++?

В C ++, наследование общего предка и наследование интерфейса (и требует определения метода в производных классах) требует множественного наследования? Например. я должен сделать следующее (вместо слияния MyInterface а также 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);

Можно ли (элегантно) объединить функциональность MyInterface а также ParentClass в один класс? (Я считаю, что как MyInterface это азбука, я не могу использовать этот тип в качестве параметра для fxn_or_method_using.)

Заранее извиняюсь, если это дубликат — я искал, но ни один из существующих вопросов C ++ не выстроился в линию. Q и / или A, возможно, были над моей (неподготовленной) головой.

0

Решение

В вашей модели наследования нет ничего плохого.

Но в C ++ вам нужен указатель или ссылка для полиморфизма. Ваш fxn_or_method_using принимает свой параметр по значению. Это имеет несколько проблем. Это вызывает нарезку, предотвращает полиморфные вызовы функций и не может работать для абстрактного типа, потому что вы не можете создавать их экземпляры.

Если вы измените fxn_or_method_using принять его параметр по ссылке, а не по значению, тогда вы можете объявить его как ссылку на MyInterface если хочешь. Все недостатки исчезают, и вы получаете желаемое полиморфное поведение.

2

Другие решения

Нет. Вы можете без проблем смешивать виртуальное и чистое виртуальное и конкретное наследование из одного и того же класса в C ++.

class baseClass{

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

virtual blah3() = 0;

};

class derivedClass : baseClass
{};
0

По вопросам рекламы [email protected]