C++如何从父调用子方法

C++ How to call a Child Method from Parent

我正在做一个小项目,我发现自己遇到了这样的情况:

class A{}

class B : class A {
    public:
        void f();
        int getType() const;
    private:
        int type;
}

class C : class A{
    public:
        int getType() const;
    private:
        int type;
}

我想知道是否有办法从 type A 的对象调用 f() 函数 (in class B)?

我试过了,但它说在 class A 中找不到函数 f() :

int main(){
    vector<A*> v;
    // v initialized with values of A ...
    if (v->getType() == 1){             // 1 is the type of B
        v->f();
    }
}

如您所见,此代码无法编译,因为 A 没有 f 方法。为了使其工作,您必须显式向下转换指针:

B* tmp = dynamic_cast<B*>(v);
tmp->f();

首先,对于您当前的 classes,您无法在 A* 上调用 getType()。因为A的接口没有这个方法。要解决此问题,您需要在 A 中使 getType 成为虚函数,或者将 type 字段移动到基 class A(如 protected)并在中初始化它子 classes 的构造函数。让我告诉你第一种方法,因为我认为这是一种更好的方法,因为它使这个函数的 objective 更加清晰。

class A {
public:
  virtual int getType() { return 0; } // or delete the function: ... getType() = 0;
}

class B : public A {
public:
  int getType() override { return 1; }
}

使用这些 classes,一旦你创建了 B 的实例,getType() returns 1 在该实例上调用时,无论它是由 A* 还是B*:

A *object = new B();
object->getType(); // returns 1

现在,如果您需要从 B 访问 f(),您可以再次将其作为虚方法添加到 A 的接口,或者强制转换为 B*.

使用虚拟方法:

class A {
public:
  virtual void f() { /* a default action maybe? */ }
}

class B : public A {
public:
  void f() /* override if you want */ { /* whatever this function does in B */ }
}

...

for (A *ptr : v)
  ptr->f();

使用演员表:

class A {
public:
  virtual int getType() { return 0; }
}

class B : public A {
public:
  void f();

  int getType() override { return 1; }
}

...

for (A *ptr : v)
  if (ptr->getType() == 1)
    dynamic_cast<B*>(ptr)->f();