21xrx.com
2024-11-05 18:37:21 Tuesday
登录
文章检索 我的文章 写文章
C++虚函数的用法及实现方法
2023-07-08 10:22:49 深夜i     --     --
C++ 虚函数 用法 实现方法

C++中的虚函数是面向对象编程的核心概念之一,它允许子类重写父类中定义的函数,从而实现多态性。通过使用虚函数,我们能够在运行时灵活地选择要调用的函数,而不用在编译时就确定。

虚函数的语法非常简单。我们只需要在函数声明前面加上关键词“virtual”即可将该函数定义为虚函数,例如:


class Parent {

public:

  virtual void foo()

    cout << "Parent::foo" << endl;

  

};

class Child : public Parent {

public:

  void foo()

    cout << "Child::foo" << endl;

  

};

可以看到,子类Child重写了父类Parent的虚函数foo。

当我们使用一个指向父类对象的指针或引用调用虚函数时,编译器会根据实际运行时对象的类型选择要调用的函数。例如:


Parent* pp = new Child();

pp->foo(); // output: Child::foo

由于pp指向的对象是Child类型的,所以调用foo()函数时会选择子类的实现。

另外,对于纯虚函数(也称为抽象函数),父类并没有提供它的具体实现,而是让子类来实现。在C++中,我们可以通过在函数声明后面加上“=0”来定义纯虚函数。例如:


class Base {

public:

  virtual void foo() = 0; // pure virtual function

};

class Derived : public Base {

public:

  void foo()

    cout << "Derived::foo" << endl;

  

};

这样,任何继承Base的子类都必须提供foo()函数的实现。

最后,我们需要注意一些实现虚函数时的细节。在C++中,虚函数是通过虚函数表来实现的。每个对象都有一个指向虚函数表的指针(也称为vptr),这个指针中存储了虚函数表的地址。虚函数表是一个数组,存储了类中虚函数的地址。当我们使用一个对象的虚函数时,编译器会通过vptr指针找到该对象对应的虚函数表,并查找要调用的函数的地址。

除此之外,还有一种情况需要注意:当我们从父类向子类转型时,如果父类的指针并不是指向一个子类对象的指针,那么使用虚函数时可能会出现运行时错误。这种情况下,我们需要使用dynamic_cast运算符来进行检查。例如:


Parent* pp = new Parent();

Child* pc = dynamic_cast<Child*>(pp);

if(pc) {

  pc->foo(); // output: Child::foo

}

else

  // pp并非指向Child对象的指针

通过使用dynamic_cast运算符,我们可以在运行时动态地检查pp指针是否指向一个Child对象。

总之,虚函数是C++中非常重要的一个特性,它允许我们在运行时灵活地选择要调用的函数,从而实现多态性。在使用虚函数时需要注意一些细节,但只要掌握了这些细节,就能够轻松地使用虚函数实现面向对象编程。

  
  

评论区

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