c ++继承和共享/非共享函数

时间:2013-11-19 23:11:06

标签: c++ function class inheritance map

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

首先,当您将对象放入std::map<std::string, A>时,对象将切片:即使对象类型为xy或{ {1}}进入地图,实际上只复制和存储对象的基础部分。如果您真的想在地图中存储潜在派生对象的对象,则需要将某种指针(可能是某种托管指针)存储到地图中。例如,您可以使用

z

假设您的班级std::map<std::string, std::shared_ptr<A>> Group; 至少有一个A功能,您可以检测是否有任何类型属于特定的派生类型,例如,使用

virtual