【问题标题】:c++ inheritance and shared / non shared functionsc++继承和共享/非共享函数
【发布时间】:2013-11-19 23:11:05
【问题描述】:

提前感谢您的帮助。 这是我的问题:

我在类 (A) 中包含子类 (x, y, z)。一些函数是共享的(在 A 中声明),而另一些则不是(在子类中声明)。

所有对象都存储在一张地图map<string,A>Groups

然后,我想使用迭代器对所有函数进行循环,但是出现了只属于一个类的函数的问题,它说 A 类不包含函数...

我想说 for(it=Groups.begin(); it!=Groups.end(); ++it) { it->second.functionShared1() 如果 objects1 属于 x 类:it->second.functionsOfClassX 并且它知道它必须在 x 类中找到函数。

我想这是不可能的,但如果您知道我可以如何解决这个问题,我将不胜感激。

我虽然想创建虚函数,但它会很乱,或者为每个类创建一个映射和一个包含所有映射的大映射。但是我不知道如何迭代它并声明outermap [“x”] = innermap [x]。就是这样,对不起,我刚开始使用C++,希望我解释得很好。

【问题讨论】:

    标签: c++ function class inheritance map


    【解决方案1】:

    为什么不直接做一个虚函数:

    class A
    {
        //...
        virtual void executeMyJunk();
    };
    
    for( it=Groups.begin(); it!=Groups.end(); ++it ) it->second.executeMyJunk();
    

    在你的子类中提供一个实现。您还可以在 A 中提供一个实现来调用所有类共有的函数。

    void A::executeMyJunk()
    {
        EveryoneHasThisFunction();
    }
    
    void x::executeMyJunk()
    {
        // Call common functions
        A::executeMyJunk();
    
        // Call functions specific to this class
        DoExxyStuff();
    }
    

    我要指出的一件事是,如果您打算使用虚拟方法,则需要在地图中存储 A*(或智能指针,例如 std::unique_ptr<A>),而不是只是A 的一个实例。

    我不确定我是否正确解释了您的问题。也许这对你没有用。如果您实际上的意思是仅在类支持该功能时才执行特定 功能,那么您可以使用dynamic_cast。在这里,我假设您的地图存储指针:

    for( it=Groups.begin(); it!=Groups.end(); ++it ) {
        x *xinst = dynamic_cast<x*>(it->second);
        if( x ) x->DoExxyStuff();
    }
    

    【讨论】:

    • 谢谢!但是如果函数根据子类采用不同类型的不同参数,我必须为类A中的每个子类编写一个函数,对吗?就像 sublass 中的对象吃掉所有东西一样,但是对于 X 类它是消耗 (A &prey),对于 Y 类消耗(double pref, A &prey)...
    • 真的不清楚你想在这里做什么。
    【解决方案2】:

    首先,当您将对象放入std::map&lt;std::string, A&gt; 时,对象会被切片:即使您将xyz 类型的对象放入地图,只有对象的基本部分实际被复制和存储。如果您真的打算在映射中存储潜在派生对象的对象,则需要将某种指针(可能是某种托管指针)存储到映射中。例如,您可以使用

    std::map<std::string, std::shared_ptr<A>> Group;
    

    假设您的类 A 至少有一个 virtual 函数,您可以检测任何类型是否属于特定派生类型,例如,使用

    if (x* ptr = dynamic_cast<x*>(it->second.get())) {
        ...
    }
    

    【讨论】:

    • 如何声明 shared_ptr ?
    • @user3006557:您将包括&lt;memory&gt;。如果您的编译器不支持它(它是在 C++11 中引入的),您可以从 Boost 获得一个版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2012-06-21
    • 2011-06-10
    • 2020-05-03
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多