欢迎光临~湖南智能应用科技有限公司-hniat.com
语言选择: 中文版 ∷  英文版

基础知识

C++里神奇的虚函数

说到虚函数(virtual function),如果说没接触过这个概念的人第一次看到肯定是一脸懵逼。但其实虚函数是有非常多的用途的,下面就介绍一下常见虚函数的用途。

虚函数:

先简单说一下虚函数的概念,那些被virtual关键字修饰的类成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),将接口与实现进行分离;通俗解释就是相同函数有着不同的实现,但因个体差异而采用不同的策略。下面来看一段简单的代码:

class Base{

public:

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

};

class Derived : public Base {

public:

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

};

int main(void) {

Base *b = new Derived();

b->foo(); // b虽然是类型Base的指针 但是实际上指向的是Derived类 所以调用的函数foo是Derived类的

return 0;

}


纯虚函数:

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0",例如:

virtual void func()=0;

拥有纯虚函数的类是不能实例化的,那纯虚函数存在的意义是什么呢?

很多时候,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出猴子、狗、猫等子类,但动物本身直接生成对象明显不合理,所以我们一般将动物声明为纯虚基类。


为基类声明虚析构函数

当一个 派生类对象经由一个基类指针被删除,而该基类带着一个非virtual析构函数时,其结果未有定义。不过一般情况下都是 对象的派生类成分没被销毁,而基类的部分被销毁。造成错误。

析构函数调用运作方式:最深层派生(most derived)的那个类其析构函数最先被调用,然后是 其每一个基类的析构函数被调用。

标准 string和 STL容器都不被设计作为基类使用,所以更别提多态了。

关闭
用手机扫描二维码关闭
二维码