2013-06-26 2 views
0

У меня есть некоторый код, который кажется similair к этому:Вызов функции из полученного объема

#include <iostream> 

class Base { 
public: 
    void test() { 
     std::cout << "Base::test()" << std::endl; 
    } 

    void test2() { 
     test(); 
    } 
}; 

class Derived : public Base { 
public: 
    void test() { 
     std::cout << "Derived::test()" << std::endl; 
    } 
}; 

int main() { 
    Derived d; 
    d.test2(); 
    return 0; 
} 

Теперь это выводит конечно Base::test(), однако я хочу вывести Derived::test()без использования вызовов виртуальных функций и используя различные обозначения для перегрузки функции: Derived::test.

Кто-нибудь знает, можно ли этого достичь?

+0

Если я понимаю, что u corrent u хочет, чтобы d.test2() вызывал непосредственно d.test(), правильно? По моим сведениям, нет никакого способа сделать это без виртуальных функций. Их цель заключается именно в этом. –

+0

Да, без перегрузки 'Base :: test2()', без использования различной нотации для 'Derived', а также без потери производительности (например, вызовы виртуальных функций). – Tim

+0

Вы можете изменить 'Base'? –

ответ

3

Вы можете использовать так называемый Любопытно Повторяющийся тип Pattern (CRTP) и сделать Base класс шаблоном:

template<typename D> 
class Base { 
public: 
    void test() { 
     std::cout << "Base::test()" << std::endl; 
    } 

    void test2() { 
     (static_cast<D*>(this))->test(); 
    } 
}; 

Тогда вы могли бы извлечь Derived из Base<Derived> вместо просто Base:

class Derived : public Base<Derived> { 
//      ^^^^^^^^^^^^^ 
//      This is the only change required in Derived 
public: 
    void test() { 
     std::cout << "Derived::test()" << std::endl; 
    } 
}; 

Адрес live example.

+0

Затем он должен проверить, какой из них быстрее - кастинг или вызовы виртуальных функций. –

+0

@KamenStoykov Приведение может быть выполнено в конструкторе. @ AndyProwl Это приятное решение, но я не думаю, что у меня есть предмет, чтобы изменить тип наследования 'Base' в класс шаблона' Base '. Некоторые производные классы уже реализованы. – Tim

+0

@ Тим: Я вижу. Тогда я действительно не верю, что есть другой способ, чем использовать виртуальные функции. –