赞
踩
虚函数的一些概念:
子类重写(覆盖)虚函数的规则:
class A {
public:
int a;
public:
A(int num) :a(num) {};
virtual A& func() {};
};
class B:public A{
public:
int b;
public:
B(int num) :A(num) {};
virtual B& func() {};
};
覆盖(重写)与隐藏的关系:
覆盖与隐藏都是子类出现与父类相同的函数名,但是有很多的不同
virtual:
override:
class A{
virtual void f1(int) const;
virtual void f2();
void f3();
};
calss B:public A{
void f1(int)const override; //正确
void f2(int)override; //错误,参数不一致
void f3()override; //错误,f3不是虚函数
void f4()override; //错误,B没有名为f4的函数
};
演示案例
class A
{
virtual void func1()final {};
};
class B:public A
{
virtual void func1()override {}; //报错,func1被A声明为final类型
};
class A
{
virtual void func1() {};
};
class B:public A
{
virtual void func1()override final {}; //正确
};
class C :public B
{
virtual void func1()override {}; //报错,func1被B声明为final类型
};
<ul><li>如果派生类调用虚函数没有覆盖默认实参,那么使用的参数是基类虚函数的默认实参;如果覆盖了虚函数的默认实参,那么就使用自己传入的参数</li>
<li>派生类可以改写基类虚函数的默认实参,但是不建议,因为这样就违反了默认实参的最初目的</li>
</ul></li>
<li><span style="color:#3399ea;"><strong>建议:</strong></span>如果虚函数使用了默认实参,那么基类和派生类中定义的默认实参最好一致</li>
class A { virtual void func1(int a, int b = 10) {}; }; class B:public A { virtual void func1(int a,int b=10)override {}; //没有改变 }; class C :public B { virtual void func1(int a, int b = 20)override {}; //改变了默认实参,不建议 }; class D :public C { virtual void func1(int a, int b)override {}; //删去了默认实参,那么在调用fun1时,必须传入a和b };
演示案例
class A { public: void show()const{ cout << "A"; }; }; class B :public A //B继承于A { public: void show()const{ cout << "B"; }; }; void printfShow(A const& data) { data.show(); } int main() { A a; B b; printfShow(a); printfShow(b); return 0; }
class A
{
public:
virtual void show()const{
cout << "A";
};
};
#include <iostream> using namespace::std; class A { public: virtual void func1() { cout << "A" << endl; }; }; class B:public A { public: virtual void func1()override { cout << "B" << endl; }; }; int main() { A *p; B b; p = &b; p->A::func1(); //正确,打印A //p->B::func1(); //错误的用法 p->func1(); //正确,打印B return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。