В C++ наследование общего предка и наследование интерфейса (и требующее определения метода в производных классах) требуют множественного наследования? Например. я должен сделать следующее (вместо слияния MyInterface
и ParentClass
):C++: являются ли общие предки и интерфейс/прототип взаимоисключающими функциями класса C++?
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
является ABC я не могу использовать этот тип в качестве параметра fxn_or_method_using
.)
Извиняюсь заранее, если это duplicate- я искал, но ни один из существующих вопросов, C++, как представляется, не выстраиваются в линию. Q и/или A могли быть над моей (неподготовленной) головой.
У меня вопрос не возникает. Во-первых: почему здесь должно быть плохое наследование? Во-вторых: почему бы не позволить ParentClass наследовать MyInterface? Если вы пришли из java-фона: в C++ нет такой вещи, как интерфейс. Вы можете объявлять виртуальные функции как 0, делая класс абстрактным, но это не значит, что вы не можете помещать определенные функции там. То есть вы можете просто поместить my_common_fxn в ParentClass с этим объявлением. –
'fxn_or_method_using' должен принять свой параметр по ссылке not value, а затем вы можете объявить его как ссылающийся на' MyInterfsce', если хотите. –
@ Клеменс 1. У меня нет проблемы с множественным наследованием - на самом деле так работает мой код. Я ищу что-то более «элегантное» с одним наследованием, поэтому я не буду сталкиваться с проблемами, забывая обоим. – mvs