【问题标题】:Use child method from the parent class c++使用来自父类 c++ 的子方法
【发布时间】:2015-08-12 19:41:44
【问题描述】:

这是交易。想象一下你的如下。 将文件加载到我想要的算法层后 能够应用4种不同的算法。所以算法类有 4 个孩子,我想做这样的事情:

int main(int argc, char* argv[]) {
    Data *data = new Data();
    Parent *alg = new Parent(data);

    alg->start();

    //and this will call the start methods defined in each child. 
}

孩子们是这样的:

class Child1: public Parent {
public:
   int start();
}

class Child2: public Parent {
public:
   int start();
}
//etc...

而我在父母 start() 方法中所做的是:

int Parent::start() {
    Child1::start();
    Child2::start();
    //etc....
    return 0;
}

但我得到一个“无法调用成员函数 'Child1::start()' 等。没有对象。” 这件事能以某种方式完成吗?从父类调用子方法?

【问题讨论】:

  • 我不知道您要解决什么问题。您能否编辑您的问题以解释您在做什么以及遇到什么困难?
  • Child1,2,3,4 语法是什么? , 现在可以成为 C++ 标识符的一部分吗?
  • 我没有写完整的东西,而是使用快捷方式......不,它不是 C++ 的一部分
  • 如果你的父类知道它的子类,你很可能有设计问题。
  • 您听说过模板函数模式吗?

标签: c++ parent


【解决方案1】:

看看“四人帮”复合模式:

子类不应派生自父类。 相反,子类和父类应该实现相同的接口, 我们称之为IAlgorithm。 这个接口应该有一个纯virtual方法start()...

这是一个示例(使用 C++11 auto 和基于范围的 for 循环):

#include <iostream>
#include <vector>

/* parents and children implement this interface*/
class IAlgorithm {
public:
   virtual int start() = 0;
};

class Parent : public IAlgorithm {
private:
    std::vector<IAlgorithm*> children;
    
public:
    void addChild(IAlgorithm* child) {
        children.push_back(child);
    }

    int start() {
        std::cout << "parent" << std::endl;
        for (auto child: children)
            child->start();
        return 0;
    }
};

class Child1 : public IAlgorithm {
public:
    int start() {
        std::cout << "child 1" << std::endl;
        return 1;
    }
};

class Child2 : public IAlgorithm {
public:
    int start() {
        std::cout << "child 2" << std::endl;
        return 2;
    }
};

class Child3 : public IAlgorithm {
public:
    int start() {
        std::cout << "child 3" << std::endl;
        return 3;
    }
};

int main()
{
   Parent parent;
   Child1 child_1;
   Child2 child_2;
   Child3 child_3;
   
   parent.addChild(&child_1);
   parent.addChild(&child_2);
   parent.addChild(&child_3);
   
   parent.start();
   
   return 0;
}

输出:

parent
child1
child2
child3

【讨论】:

  • 谢谢先生!这太棒了!
【解决方案2】:

通常情况下,父级不能调用子方法。在这种情况下,您已将类创建为父类型,因此在子类中调用某些内容会非常危险,因为子类可能会假设存在父类中不存在的成员方法或变量。

【讨论】:

  • 您说的是“一般”,但可以通过某种方式完成吗?
  • 子类的内存大小不能小于父类,因为它必须包含父类中的所有内容。如果一个孩子添加一个成员变量,那么这个孩子会更大。当您将类创建为父类时,它只会为该类型的类保留足够的空间,如果子类尝试访问父类中不存在的内容,它将读取超过保留内存空间的末尾,这可能导致崩溃。
  • 您可以在 this 指针上使用 reinterpret_cast 来调用不同类的成员函数。我几乎可以 100% 保证您不想这样做。您需要在问题中提供更多信息,以便人们知道如何最好地重组您的代码以使其工作。
  • 我是新手,这正是我被告知要做的事情,我正在努力解决
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2013-10-13
  • 2015-12-21
相关资源
最近更新 更多