2017-01-03 5 views
1
#include <iostream> 
#include <functional> 

using namespace std; 

class Child; 

class Parent { 
    public: 
    template <class Function, class... Args> 
    void f(Function&& f, Args&&... args) 
    { 
     Child *c = dynamic_cast<Child*>(this); 
     cout << c->n; 
    } 
}; 

class Child : public Parent { 

public: 
    int n = 0; 
}; 

int main() 
{ 
    Parent *p = new Child(); 
    cout << "abc"; 
    return 0; 
} 

Код предназначен для доступа к члену дочернего класса из функции члена шаблона родителя. Я хотел бы сделать это, потому что функция члена шаблона не может быть виртуальной. Ошибка, которую я получил: «« Детский »является неполным типом». Как это сделать?Как получить доступ к дочернему элементу из функции шаблона родителя?

ответ

3

Вы можете отделить определение и объявление f и перенести определение после определения класса Child. например

class Child; 

class Parent { 
public: 
    virtual ~Parent() = default;   // must be polymorphic type 
    template <class Function, class... Args> 
    void f(Function&& f, Args&&... args); // the declaration 
}; 

class Child : public Parent { 
public: 
    int n = 0; 
}; 

// the definition 
template <class Function, class... Args> 
void Parent::f(Function&& f, Args&&... args) 
{ 
    Child *c = dynamic_cast<Child*>(this); 
    if (c != nullptr)      // check the result of conversion 
     cout << c->n; 
} 

Обратите внимание, что

  1. базовый класс Parent должен быть polymorphic type использовать dynamic_cast; то есть он должен иметь по меньшей мере одну функцию virtual.
  2. Прежде чем использовать его, вы должны проверить результат dynamic_cast.
Смежные вопросы