【问题标题】:C++, How to call a child method in the parent classC++,如何在父类中调用子方法
【发布时间】:2022-07-07 16:46:30
【问题描述】:

在我的项目中,我有 2 个类,为了简化,我称它们为 A 和 B。

AB 的子级。

当我用'A'调用'B'的方法时我需要它,例如:

B::bFunction(...){...};

...Other file...
A a(...);
a.bFunction(...);

B 的方法调用 A 的函数作为响应,即调用子的方法

 a.bFunction(...) --> bFunction process --> in the end of bFunction process it calls aFunction(...)

'aFunction(..)'是A的一个方法

我认为可能会限制它的一件事是,A 类(孩子)只是 B(亲戚)的众多孩子之一,而这些类(具有不同的名称)不是彼此相等,它们的功能尽管名称相同,但做不同的事情。

我不知道该怎么做,我请求你的帮助,我不在乎你是否必须将父级与子级分离并使其成为两个单独的类。

提前致谢

【问题讨论】:

  • 当你说“A是B的孩子”时,你的意思是B继承自A吗?您可以尝试创建一个minimal reproducible example 向我们展示吗?
  • 看来你需要的是让aFunction虚拟化。
  • 我觉得你表达这个问题的方式很混乱。因此,当您说a.bfunction() 时,您希望 B 的 bfunction 运行。对吗?
  • @RC0993 这就是为什么张贴者应该发布真正的可编译代码而不是代码描述,因为这总是令人困惑。
  • 为了大家,我正在编辑我的问题

标签: c++ parent hierarchy


【解决方案1】:

如果bFunction是在A中定义的虚方法,那么如果a实际上是B类型,你就可以调用bFunction,否则你不能调用B::bFunction

这是一个例子。

#include <iostream>

class A
{
public:
    virtual void bFunction()
    {
        std::cout << "A::bFunction()" << std::endl;
    }

    void test()
    {
        bFunction();
    }
};

class B : public A
{
public:
    void bFunction() override
    {
        std::cout << "B::bFunction()" << std::endl;
    }
};

int main()
{
    A *a = new B(); // <- a is actually a B instance
    a->test(); // <- calls A::test that calls B::bFunction()

    delete a;
    return 0;
}

或者,您可以将 bFunction 声明为静态,但您将无法访问数据成员。

【讨论】:

    【解决方案2】:

    基本函数必须是虚拟的才能进行运行时继承。 如下示例

    class base {
    public:
        virtual void print()
        {
            cout << "print base class\n";
        }
      
        void show()
        {
            cout << "show base class\n";
        }
    };
      
    class derived : public base {
    public:
        void print()
        {
            cout << "print derived class\n";
        }
      
        void show()
        {
            cout << "show derived class\n";
        }
    };
      
    int main()
    {
        base *bptr;
        derived d;
        bptr = &d;
      
        // Virtual function, binded at runtime
        bptr->print();
      
        // Non-virtual function, binded at compile time
        bptr->show();
        
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2020-01-26
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      相关资源
      最近更新 更多