zoukankan      html  css  js  c++  java
  • 【C++】虚函数

    来自:黄邦勇帅

    1.注意不能把成员变量声明为虚有的,也就是说 virtual 关见字不能用在成员变量前面。

    2.一般应使用基类指针来调用虚函数,如果用点运算符来调用虚函数就失去了它的意义.

    3.重定义虚函数时不需再使用virtual 关见字,当然也可以继续标明 virtual 关见字

    4.虚函数的类被称为多态类.C++使用虚函数支持多态性.

    5.一旦将函数声明为虚函数,则不管它通过多少层继承,它都是虚函数

    6.隐藏虚函数:如果基类定义了一个 虚函数 ,但派生类中 却定义了一个虚函数的重载板本,则派生类的这个版本就会把基类的虚函数隐藏掉,当使用基类 指针调用该函数时只能调用基类的虚函数,而不能调用派生类的重载版本,当用派生类的对象调用基类的 虚函数时就会出现错误了 ,因为基类的虚函数被派生类的重载版本隐藏了。

    7.如果虚函数形参有默认值,那么派生类中的虚数的形参不论有无默认值,当用指针调用派生类中的虚函数时就会被基类的默认值覆盖,即派生类的 默认值不起作用。但用派生类的对象调用该函数时,就不会出现这种情况。

    8.析构函数可以是虚函数,但构造函数不能

    9.纯虚函数声明形式为 virtual 类型 函数名(参数列表)=0;注意后面的 等于0;

    10.如果类至少有一个纯虚函数,则这个类就是抽象的。

    11.任何派生类都必须实现纯虚函数的自已的版本. 如果不实现纯虚函数那么该类也是抽象类。

    12.抽象类不能有对象,抽象类只能用作其它类的基类

    13.仍然可以用抽象类声明一个指针,这个指针指向派生类对象.

    14.虚函数虚拟特性是以层次结构的方式来继承的,例如C从B派生而且C中重定义了B中的虚函数,而D又从C派生且未重定义B中的虚函数,这时声明一个基类指针P,当P指向类D,并调用D中的虚函数时,由于D中未重定义虚函数他会调用基类中的虚函数版本,这时他会调用类C中的虚函数而不是类B中的虚函数,因为类C比类B更接近于类D.

    对于第7点,例子如下:

    #include<iostream>
    using namespace std;
    
    class A
    {
    public:
        virtual void fun(int i = 9)
        {
            cout << "A fun" << endl;
            x = i;
        }
        int x;
    };
    
    class B:public A
    {
    public:
        void fun(int i = 8)
        {
            cout << "B fun" << endl;
            x = i;
        }
    };
    
    int main()
    {
        B b;
        B *pb = new B;
        A *pa = new B;
        b.fun();
        cout << b.x << endl;  // 8
        cout << "-----------------" << endl;
        pb->fun();
        cout << pb->x << endl; // 8
        cout << "-----------------" << endl;
        pa->fun();
        cout << pa->x << endl; // 9 这时,派生类虚函数里的参数默认值无效
        cout << "-----------------" << endl;
        return 0;
    }
  • 相关阅读:
    请求headers处理
    requests模块
    urllib3
    urllib
    百度AI搜索引擎
    CSS层叠样式表--使用
    学习requests_html
    聚合新闻头条
    爬虫工程师的月薪如何?
    Linux日志系统
  • 原文地址:https://www.cnblogs.com/dplearning/p/4785724.html
Copyright © 2011-2022 走看看