21xrx.com
2024-12-22 21:20:54 Sunday
登录
文章检索 我的文章 写文章
如何在C++中通过基类对象调用子类方法?
2023-07-06 22:22:23 深夜i     --     --
C++ 继承 基类 子类 调用方法

在C++中,基类是可以继承的,而子类就是继承基类的类。在基类中定义了一些方法,子类继承这些方法,并且可以增加自己的方法。那么在基类对象中,如何调用子类的方法呢?以下是几种方法:

方法一:使用虚函数

C++中,虚函数是可以被重写的,在子类中重写基类的虚函数,然后在基类的指针中调用该虚函数,就可以调用到子类的方法了。

例如:


class Base {

public:

  virtual void foo() { cout << "Base::foo() called" << endl; }

};

class Derived : public Base {

public:

  void foo() override { cout << "Derived::foo() called" << endl; }

};

int main() {

  Base *p = new Derived();

  p->foo(); // Derived::foo() called

  return 0;

}

方法二:使用动态转型

使用动态转型,可以将基类指针转换成子类指针,然后再调用子类的方法。

例如:


class Base {

public:

  void foo() { cout << "Base::foo() called" << endl; }

};

class Derived : public Base {

public:

  void bar() { cout << "Derived::bar() called" << endl; }

};

int main() {

  Base *p = new Derived();

  Derived *q = dynamic_cast<Derived*>(p);

  if (q != nullptr) {

    q->bar(); // Derived::bar() called

  }

  return 0;

}

使用动态转型时需要注意,如果基类指针不指向子类对象,转型会失败,返回null指针,所以需要进行判断。

方法三:使用静态转型

使用静态转型,可以直接将基类指针转换成子类指针,然后再调用子类的方法,但是需要注意,如果基类指针不指向子类对象,转型结果未知。

例如:


class Base {

public:

  void foo() { cout << "Base::foo() called" << endl; }

};

class Derived : public Base {

public:

  void bar() { cout << "Derived::bar() called" << endl; }

};

int main() {

  Base *p = new Derived();

  Derived *q = static_cast<Derived*>(p);

  q->bar(); // Derived::bar() called

  return 0;

}

综上所述,通过虚函数、动态转型、静态转型都可以在C++中通过基类对象调用子类方法,但是需要根据具体情况选择合适的方法来实现。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复