父类使用虚函数是为了让子类重写,那子类重写的时候也需要带virtual关键字吗?比如:
class A{
virtual bool init();
};
class B : public A{
virtual bool init(); //这里的vitual是必须的吗?好像不用也能编译通过呃…..
};
c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此,在子类从新声明该虚函数时,可以加,也可以不加,但习惯上每一层声明函数时都加virtual,使程序更加清晰。
A*pA = new B; //子类可以转换为父类赋值给父类对象;但是反过来不正确
B mB; //先构造父类,再构造子类
关于函数调用
1. 如果是虚函数,子类有,调用子类的函数,否则调用父类函数
2..非虚函数,都是调用父类的
示例
class xBase
{
public:
xBase()
{
printf("xBase construct\n");
}
virtual void Test(int i)
{
printf("xBase test %d\n", i);
}
void TestA(float f)
{
printf("xBase test %0.3f\n", f);
}
};
class xChildA : public xBase
{
public:
xChildA()
{
printf("xChildA construct\n");
}
virtual void Test(int i)
{
printf("xChildA test %d\n", i);
}
void TestA(float f)
{
printf("xChildA test %0.3f\n", f);
}
};
xBase construct
xChildA construct
xChildA test 8
xBase test 2.300
xBase construct
xChildA construct
xChildA test 11
xChildA test 12.500
虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是: (1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。 纯虚函数一般没有代码实现部分,如 virtual void print() = 0; 而一般虚函数必须要有代码的实现部分,否则会出现函数未定义的错误。 virtual void print() { printf("This is virtual function\n"); } (2)包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。