关于继承这一章
2019-03-20 本文已影响0人
sgy1993
如果没有关键字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,不能实现多态