2011-01-16 2 views
2

Coluld вы предоставляете простой пример кода? (извините C++ nube) и как вызвать функцию из класса, который вы распространяете?C++ возможно ли, чтобы класс расширил один класс и одновременно реализовал интерфейс?

+0

Не могли бы вы уточнить, чего вы хотите достичь?Вы хотите перегрузить метод и вызвать родительскую версию метода или просто вызвать унаследованный метод? – ereOn

+0

Просьба уточнить ваш вопрос. Чего вы пытаетесь достичь? У вас есть спецификация, которую вы должны выполнить? Скопируйте его. Будьте как можно более конкретными, чтобы другие могли понять вашу проблему, чтобы они получили возможность дать вам весомый ответ. – pts

ответ

3

Немного полезный пример: :-)

class CImplementation 
{ 
public: 
void doFoo(); 
}; 

void CImplementation::doFoo() 
{ 
//implementation 
} 

class IInterface 
{ 
public: 
virtual void foo()=0; 
}; 

class DerivedFromImplementationAndInterface : public CImplementation, public IInterface 
{ 
virtual void foo(); 
}; 

void DerivedFromImplementationAndInterface::foo() 
{ 
doFoo(); 
} 


//possible usage: 
void method(IInterface& aInterface) 
{ 
aInterface.foo(); 
} 

void test() 
{ 
IInterface* d = new DerivedFromImplementationAndInterface; 
method(*d); 
} 
1

Не уверен, что вы спрашиваете:

class A 
{ 
    public: 
    void method(); 
}; 

class B 
{ 
    public: 
    void method(); 
}; 

class C : public A, public B 
{ 
    public: 
    void callingMethod(); 
}; 

void C::callingMethod() 
{ 
    // Here you can just call A::method() or B::method() directly. 
    A::method(); 
    B::method(); 
} 

Обратите внимание, что множественное наследование может привести к очень трудно решаемые проблемы, и я бы рекомендовал использовать его только в случае необходимости.

+0

и как насчет реализации? извините интерфейсы. – Rella

+1

В 'C++' нет таких инструментов, как 'interfaces'. Однако вы можете иметь множественное наследование, но обычно нужно быть очень осторожным. – ereOn

3

В C++ вы можете расширить несколько классов, это называется множественным наследованием. Скорее всего, это то, что вы ищете. Пожалуйста, прочитайте хорошую книгу о множественном наследовании и C++ (краткое введение: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr134.htm), потому что есть много подводных камней и деталей, на которые нужно обратить внимание.

Пример для множественного наследования:

class A { ... }; 
class B { ... }; 
class C: public A, public B {}; // C inherits from A and B. 
+0

Я считаю, что это самый простой ответ. Я присоединяюсь к @pts, рекомендуя прочитать хорошую книгу (или веб-страницу) о ловушках множественного наследования перед их использованием. Если вы «должны» использовать множественное наследование, тогда рекомендуется иметь один базовый класс, а другой - только как интерфейсы (т. Е. Не имеет каких-либо переменных-членов). – Rafid

1

вопрос, как указано,

C++, можно ли сделать класс расширить один класс и реализовать другой?

не имеет смысла. Ответ на это просто «да». Вы можете получить любое количество классов: C++ полностью поддерживает множественное наследование.

Таким образом, учитывая, что вопрос, как указано на самом деле не имеет смысла, это по крайней мере, возможно, что вы означало спросить

C++ это можно сделать класс расширить один класс, и тем самым реализовать другой ?

Ответ на этот вопрос также да, но это не тривиально. Он включает в себя виртуальное наследование. Это довольно сложно.

Вот пример:

#include <iostream> 

void say(char const s[]) { std::cout << s << std::endl; } 

class TalkerInterface 
{ 
public: 
    virtual void saySomething() const = 0; 
}; 

class TalkerImpl 
    : public virtual TalkerInterface 
{ 
public: 
    void saySomething() const 
    { 
     say("TalkerImpl!"); 
    } 
}; 

class MyAbstractClass 
    : public virtual TalkerInterface 
{ 
public: 
    void foo() const { saySomething(); } 
}; 

class MyClass 
    : public MyAbstractClass 
    , public TalkerImpl 
{}; 

int main() 
{ 
    MyClass().foo(); 
} 

Виртуальное наследование гарантирует, что существует только один суб-объект типа TalkerInterface в MyClass инстанции. Это имеет некоторые противоречивые последствия. Один из них заключается в том, что «наследование в реализации» работает, а другое заключается в том, что построение под-объекта базового класса происходит в каждом конструкторе MyClass и, как правило, в самом производном классе. .

Приветствия & НТН,

2

C++ в явном виде не имеют интерфейсы, эквивалент интерфейса в Java, как правило, реализуется с классом, имеющий только чистые виртуальные функции (плюс конструкторы, деструктор, копия задания):

#include <iostream> 

// interface 
class Fooable { 
    public: 
    virtual int foo() = 0; 
    virtual ~Fooable() {} 
}; 

// base class 
class Base { 
    public: 
    void non_virtual_function() { std::cout << "Base::non_virtual_function\n"; } 
    virtual void virtual_function() { std::cout << "Base::virtual_function\n"; } 
}; 

// derived class, inherits from both Base "class" and Fooable "interface" 
class Derived: public Base, public Fooable { 
    public: 
    virtual int foo() { 
     // call base class function 
     Base::non_virtual_function(); 
     // virtual call to function defined in base class, overridden here 
     virtual_function(); 
    } 
    virtual void virtual_function() { 
     // call base class implementation of virtual function directly (rare) 
     Base::virtual_function(); 
     std::cout << "Derived::virtual_function\n"; 
    } 
    void non_virtual_function() { 
     // not called 
     std::cout << "Derived::non_virtual_function\n"; 
    } 
}; 

int main() { 
    Derived d; 
    d.foo(); 
} 
Смежные вопросы