柯桥区建设局网站,经典的公司简介,win2008网站404,专门做微场景的网站多态一定会成功吗
因为逻辑是用户编写的#xff0c;那么肯定会有遗漏的地方#xff0c;那就要规则来限制。就比如多态#xff0c;都知道条件之一是子类重写了父类的虚函数#xff0c;但是如果子类没有严格遵守这个规则#xff0c;就无法达到目的。就比如这个代码#xf…多态一定会成功吗
因为逻辑是用户编写的那么肯定会有遗漏的地方那就要规则来限制。就比如多态都知道条件之一是子类重写了父类的虚函数但是如果子类没有严格遵守这个规则就无法达到目的。就比如这个代码
class A {
public:virtual void aaa(int i) const{cout aaa endl;}};
class B :public A {virtual void aaa(int i) {cout bbb endl;}
};
void help(A a){a.aaa(11);
}
int main(){B b;help(b);return 0;
}刚开始看会以为这是个多态但其实这并不是会打印aaa而不是bbb。
为什么呢因为aaa函数并没有被严格地重写const属性丢失了。
这其实挺难发现的因为编译器也并不会去给我们指出来毕竟多态也并不是一定要实现。
所以这时候就体现override的作用添加override后 还有一种好处是能让人知道这个函数是重写并且是用作多态的。
虽然子类直接覆盖父类的虚函数但是不加virtual也能达到多态
// 输出bbb
class A {
public:virtual void aaa(int i){cout aaa endl;}};
class B :public A {void aaa(int i){cout bbb endl;}
};但是这样会更直观
// 输出bbb
class A {
public:virtual void aaa(int i){cout aaa endl;}
};
class B :public A {void aaa(int i) override{cout bbb endl;}
};