Есть ли в C ++ реализация статического полиморфизма интерфейса, который не использует vtable? - PullRequest
6 голосов
/ 06 апреля 2010

Имеет ли C ++ правильную реализацию интерфейса, который не использует vtable?

, например

class BaseInterface{
public:
virtual void func() const = 0;
}

class BaseInterfaceImpl:public BaseInterface{
public:
void func(){ std::cout<<"called."<<endl; }
}

BaseInterface* obj = new BaseInterfaceImpl();
obj->func();

вызов func в последней строке переходит к vtable для поиска func ptrBaseInterfaceImpl :: func, но есть ли C ++ способ сделать это напрямую, так как BaseInterfaceImpl не разделен на подклассы из какого-либо другого класса, кроме чисто интерфейсного класса BaseInterface?

Спасибо.Gil.

Ответы [ 2 ]

7 голосов
/ 06 апреля 2010

Да. Это идет под прозвищем CRTP . Есть гусак.

0 голосов
/ 06 апреля 2010

Я думаю, что на любом языке для динамической диспетчеризации потребуется перейти к какому-то эквиваленту vtable, если во время компиляции он не знает, какую функцию нужно вызывать. Это может быть результатом умной оптимизации компилятора или такой техники, как CRTP (о чем уже говорилось).

...