关于继承这一章

如果没有关键字virtual 程序将根据引用类型或者指针类型选择方法,如果使用了virtual,则将根据引用或指针指向的对象的类型来选择方法
下面是一个不加virtual的例子

#include <iostream>
#include <stdio.h>
class sgy {
public:
    void print_some() {
        printf("sgy\n");
    }
};

class sgy_child : public sgy {
public:
    void print_some() {
        printf("sgy_child\n");
    }
};
int main()
{
    sgy_child sgy_child1;
    sgy &sgy1 = sgy_child1;
    //sgy *sgy1 = &sgy_child1
    sgy1.print_some();//这个会调用那个函数呢?
    return 0;
}

输出结果是, sgy1是 class sgy类型的所以他调用的是sgy的print_some函数

根据引用的类型来决定调用函数

root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test# ./test
sgy
root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test#

如果是改成下面的这个呢?


image.png

输出结果如下

root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test# ./test
sgy_child
root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test#

加上virtual之后,则是根据引用对象的类型来决定调用什么函数

另外一定是父类,或者叫基类加上virtual才管用,派生类单独加上virtual是不管用的,即没有多态

即如果是下面这样


image.png

输出的结果是

root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test# ./test
sgy
root@iZ2ze9yqb3xdqngyx445idZ:~/sgy/test#

所以不加父类不加virtual,一定要是基类,否则子类有virtual,不能实现多态

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。