有什么方法可以从父类调用子方法吗?

时间:2015-03-13 13:36:29

标签: oop c++11 cocos2d-x

我正在为cocos2d-x构建一个游戏,并希望从父类调用子类方法。

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

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

class SubChild : Child {
    void functionToBeCalledFromParent();
}

2 个答案:

答案 0 :(得分:0)

  

我正在为cocos2d-x构建游戏,并希望从父类调用子类方法

您可以1)声明函数在父级中并在子级中定义它或2)在父级中定义它并在子级中覆盖它(重新定义它)。

答案 1 :(得分: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

SubChild作为模板参数传递给Child<>是有效的,因为typename在声明后很快就会生效,它就在继承列表分隔符:的前面。

static_cast中使用Parent“向下转换”是非常温和的。如果子类没有定义Parent中调用的函数,则编译将失败。

这种技术称为静态编译时多态,它就是ATL和WTL的基础。 oppsosite和更传统的方法可能是动态运行时多态,它就是你用虚函数得到的。