我们知道,要想重写基类的虚函数,函数名称、参数、返回类型必须相同,才能够实现多态。
class a {
public:
a() = default;
virtual void display(int a)const {
std::cout << " A virtual" << std::endl;
}
};
class b :public a {
public:
b() = default;
void display(int a)const {
std::cout << " B" << std::endl;
}
};
class c :public b {
public:
c() = default;
//very very nice
void display(int a)const override{
std::cout << "C virtual" << std::endl;
}
};
int main() {
a* ptr = nullptr;
b second;
ptr = &second;
ptr->display(2.3);
c third;
ptr = &third;
ptr->display(2.3);
这里要注意:b类中重载时什么关键字都没有写,vitual和override都没有,但依然会别当作虚函数。
这是我们知道的,那么如果不相同会怎么样呢?
这里就不贴例子了,记住一点,只要和上面例子中不同的,都会别当作非虚成员函数来处理。
比如,如果我在b类中是这样写:
virtual void display(double a)const{
.......
}
这个函数依然会被当作非虚成员函数来处理。
下面是我的总结,可能写的不太容易理解:
/*总结:
父类为虚函数时,
子类中,
1.当名称相同,是不是virtual都一样,但是参数不同时,编译会将其当作非虚成员函数进行处理
2.如果名称相同,是不是virtual都一样,参数相同,都是对虚函数的重写,这里要注意的是,就算不加vitual,不加override也是从写虚函数
父类为非虚函数时,
3.如果子类为同名同参虚函数,编译器依然会将其当作非虚成员函数来处理,就算后面的函数也是如此,依然是非虚成员函数来处理
4.如果子类为同名不同参虚函数,和上面相同的结果
所以呢,只有当名称相同,并且参数相同的虚函数时,才能作为虚函数,实现多态。*/