В 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, возможно, были над моей (неподготовленной) головой.
В вашей модели наследования нет ничего плохого.
Но в C ++ вам нужен указатель или ссылка для полиморфизма. Ваш fxn_or_method_using
принимает свой параметр по значению. Это имеет несколько проблем. Это вызывает нарезку, предотвращает полиморфные вызовы функций и не может работать для абстрактного типа, потому что вы не можете создавать их экземпляры.
Если вы измените fxn_or_method_using
принять его параметр по ссылке, а не по значению, тогда вы можете объявить его как ссылку на MyInterface
если хочешь. Все недостатки исчезают, и вы получаете желаемое полиморфное поведение.
Нет. Вы можете без проблем смешивать виртуальное и чистое виртуальное и конкретное наследование из одного и того же класса в C ++.
class baseClass{
public:
blah1(){
//stuff
}
virtual blah2();
virtual blah3() = 0;
};
class derivedClass : baseClass
{};