【问题标题】:C++ Call subclass method from superclassC++ 从超类调用子类方法
【发布时间】:2013-03-22 12:11:09
【问题描述】:

我有以下风格的代码:

class SubClass;
class SuperClass;

class SuperClass {

private:

    void bar() {

        SubClass().foo();
    }
};

class SubClass : SuperClass {

public:

    void foo() {};
};

所以基本上我有一个 SuperClass,我想从其中调用子类的方法 foo()。 VS 2012 给我以下错误:

错误 1 ​​错误 C2514:“子类”:类没有构造函数。

错误 2 错误 C2228:'.foo' 左侧必须有类/结构/联合。

我想做的事情的正确结构是什么?

【问题讨论】:

  • virtual void foo();?
  • 你不应该这样做。
  • 这是一件非常好的和有用的事情。这就是为什么虚函数被添加到 c++ 中的原因。

标签: c++ class superclass


【解决方案1】:

你可以尝试一些 CRTP, 即:

#include <iostream>

class SubClass;

template<typename T>
class SuperClass {
private:
    void bar() {
        ((T *) this)->foo();
    }
public:
    void foobar() {
        this->bar();
    }
};

class SubClass : public SuperClass<SubClass> {
public:
    void foo() {
        std::cout << "hello crtp!" << std::endl;
    };
};

int main(void){
    SubClass a = SubClass();
    a.foobar();
    return 0;
}

【讨论】:

    【解决方案2】:

    首先,您必须意识到调用SubClass().foo() 与当前对象无关——它将创建一个新的SubClass 对象并调用其foo 成员。如果您希望bar 函数在当前对象上调用foo,您需要按照Kiril 的建议将foo 声明为基类中的虚函数。

    但是,如果您确实想在一个新对象上调用 foo(这没有多大意义,但无论如何),那么您做对了。您的示例未编译,因为 SubClass 是前向声明的,但未在 bar 函数之前定义 - 您可能希望将 bar 的实现移至 SubClass 的定义下方,如下所示: 类子类; 类超类;

    class SuperClass {
    
    private:
    
        void bar();
    };
    
    class SubClass : SuperClass {
    
    public:
    
        void foo() {};
    };
    
    void SuperClass::bar() {
        SubClass().foo();
    }
    

    【讨论】:

      【解决方案3】:

      你不能这样做。您必须(至少)在基类中声明该方法。例如:

      #include <iostream>
      
      class SuperClass 
      {
      public:
          void bar() 
          {
              foo();
          }
      private:
          virtual void foo() // could be pure virtual, if you like
          {
              std::cout << "SuperClass::foo()" << std::endl;
          }
      };
      
      class SubClass : public SuperClass // do not forget to inherit public
      {
      public:
          virtual void foo() { std::cout << "SubClass::foo()" << std::endl; }
      };
      
      int main()
      {
          SuperClass* pTest = new SubClass;
      
          pTest -> bar();
      
          delete pTest;
      }
      

      将打印SubClass::foo()

      【讨论】:

      • “class SubClass : public SuperClass”中的“public”关键字是什么意思?
      • @ErbenMo - public继承(也可以是privateprotected
      • 谢谢。这允许调用“SuperClass”的任何子类的 foo() 方法。我需要这个:vector&lt;Employees*&gt; employees 存储SecretaryFootBoyCEO 等对象。它们中的每一个都是Employee 的子类,并且它们都有一个operate() 方法,当然实现方式非常不同。有了这个解决方案,就没有问题了。
      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 2012-04-18
      • 1970-01-01
      • 2011-12-21
      相关资源
      最近更新 更多