2016-07-04 6 views
0

В 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 могли быть над моей (неподготовленной) головой.

+4

У меня вопрос не возникает. Во-первых: почему здесь должно быть плохое наследование? Во-вторых: почему бы не позволить ParentClass наследовать MyInterface? Если вы пришли из java-фона: в C++ нет такой вещи, как интерфейс. Вы можете объявлять виртуальные функции как 0, делая класс абстрактным, но это не значит, что вы не можете помещать определенные функции там. То есть вы можете просто поместить my_common_fxn в ParentClass с этим объявлением. –

+2

'fxn_or_method_using' должен принять свой параметр по ссылке not value, а затем вы можете объявить его как ссылающийся на' MyInterfsce', если хотите. –

+0

@ Клеменс 1. У меня нет проблемы с множественным наследованием - на самом деле так работает мой код. Я ищу что-то более «элегантное» с одним наследованием, поэтому я не буду сталкиваться с проблемами, забывая обоим. – mvs

ответ

2

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

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

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

+0

Спасибо, Алан, работает как шарм! – mvs

0

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

class baseClass{ 

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

    virtual blah3() = 0; 

}; 

class derivedClass : baseClass 
{ 


};