2012-01-31 5 views
0

Как вызвать метод базового класса, если он не абстрактный.Метод базового класса вызова, если не абстрактно

class WithAbstMethod { 
public: 
    virtual void do() = 0; 
} 

class WithImplMethod : public WithAbstMethod { 
public: 
    virtual void do() { 
     // do something 
    } 
} 

template<typename BaseT> 
class DerivedClass : BaseT { 
public: 
    virtual void do() { 
     BaseT::do(); // here is a question. How to modify code, so that do() is called if it is not abstract? 
     // do something 
    } 
} 

void main() { 
    DerivedClass<WithAbstMethod> d1; 
    d1.do(); // only DerivedClass::do() should be called 
    DerivedClass<WithImplMethod> d2; 
    d2.do(); // both WithImplMethod::do() and DerivedClass::do() should be called 
} 

Можно ли сделать это с помощью шаблонов в компиляции без особого кода (экземпляр DerivedClass :: метод делать() с BaseT :: делать (вызов) и вне зависимости от типа BaseT)? Очевидно, что реализация в классе WithAbstMethod не является вариантом. Код выше - псевдокод, поэтому может содержать незначительные ошибки.

+3

Обратите внимание, что 'do' является зарезервированным словом в C++ :) –

ответ

3

Фактически, обеспечение исполнения для WithAbstMethod::do() может быть вариантом. Абстрактным функциям разрешено иметь реализацию.

void WithAbstMethod::do() 
{ 
    // do nothing... 
} 
+0

Я не совсем понимаю, что вы имеете в виду. Этот метод должен быть абстрактным по дизайну. Поэтому я хочу, чтобы ошибка компиляции в таком коде: void main() {WithAbstMethod a1; } – cos

+1

Ну, вы должны получить ошибку времени компиляции для 'void main()' уже. В стороне, если 'WithAbstMethod :: do()' абстрактно, вы все равно получаете ошибку времени компиляции, если вы ее внедрили! Ах, вы не заметили, что вы можете реализовать абстрактных членов, я думаю: вы можете! 'struct A {void B() = 0; }; void A :: B() {} 'Это абстрактный класс' A' с реализованной абстрактной функцией 'A :: B()'. Это может быть, например, быть полезным в вашем случае. –

+1

Компилятор не позволит вам создать экземпляр абстрактного класса (другими словами, оставьте '= 0' в объявлении функции). Но вам все же разрешено иметь реализацию абстрактной функции, которую могут вызывать производные классы. Для 'void' функций, которые могут работать хорошо и легко; он может не соответствовать, если у вас есть абстрактные функции, которые должны были бы вернуть что-то, и нет разумного «дефолта». –

Смежные вопросы