2015-03-13 2 views
0

Я создаю игру для cocos2d-x и хочу вызвать метод класса child из родительского класса.Есть ли способ, которым я могу вызвать дочерний метод из родительского класса?

class Parent { 
    *//do something 
    //How can i call method from subchild class here?* 
} 

class Child : Parent { 
    *//do something* 
} 

class SubChild : Child { 
    void functionToBeCalledFromParent(); 
} 
+4

Существует простой способ: использовать виртуальную функцию в 'Parent', переопределенную в' SubChild'. – Deduplicator

+0

Существует менее простой способ: используйте CRTP – Yakk

ответ

0

Я строй игры для cocos2d-х и хочу вызвать метод класса ребенка от родительского класса

Вы можете 1) объявить функцию в родительском и определить его ребенок или 2) определить его в родительском и переопределить (переопределить) в дочернем.

0

Используя CRTP, ваш пример

class Parent { 
    void callSubclassFunction() { 
     //How can i call method from subchild class here? 
    } 
} 

class Child : Parent { 
} 

class SubChild : Child { 
    void functionToBeCalledFromParent(); 
} 

превратится в

#include <iostream> 

template <typename TSubclass> 
class Parent { 
public: 
    void callSubclassFunction() { 
     static_cast<TSubclass*>(this)->functionToBeCalledFromParent(); 
    } 
}; 

template <typename TSubclass> 
class Child : public Parent<TSubclass> { 
}; 

class SubChild : public Child<SubChild> { 
public: 
    void functionToBeCalledFromParent() { 
     std::cout << "SubChild!" << std::endl; 
    } 
}; 

int main() 
{ 
    SubChild child; 
    child.callSubclassFunction(); 
} 

Runnable at Coliru

Passing SubChild в качестве параметра шаблона для Child<> работ, так как имяТипа действует как только он заявил, который находится непосредственно перед делителем списка наследования :.

Использование static_cast в "downcast" в Parent совершенно безвредно здесь. Если подкласс не определяет функцию, вызванную в Parent, компиляция просто завершится неудачей.

Этот метод называется статического или во время компиляции полиморфизма, и это то, что ATL и WTL построены на. Опсозитом и, возможно, более обычным методом будет динамический или полигонизм, и это то, что вы получаете с помощью виртуальных функций.

+0

Спасибо :) это сработало для меня :) – nullPointerException

+0

Не стесняйтесь повышать свой ответ тогда ;-) –

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