试一试Virtual……
重温C++……去年这个时候是在用C++的经验看Java,今年反过来……囧
今天看下关于 虚函数 的部分……
在多态、重写这一方面,C++和Java不同的一点:如果子类重写了父类的方法(函数),多态 父类 A = new 子类 B的话,Java会自动调用子类的方法,而C++依然使用父类的方法,如果要使用子类的,必须申明该方法为virtual,即声明为虚函数,样例如下:
-
#include<iostream>
-
using namespace std;
-
-
class A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from A"<<endl;
-
}
-
};
-
-
class B:public A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from B"<<endl;
-
}
-
};
-
-
class C:public A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from C"<<endl;
-
}
-
};
-
-
int main()
-
{
-
A* a = new A;
-
A* b = new B;
-
A* c = new C;
-
a->read();
-
b->read();
-
c->read();
-
return 0;
-
}
这时打印出来的是三个read from A……
如果在A中的read方法前面加上virtual修饰,变成
-
#include<iostream>
-
using namespace std;
-
-
class A
-
{
-
public:
-
virtual void read()
-
{
-
cout<<"read from A"<<endl;
-
}
-
};
-
-
class B:public A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from B"<<endl;
-
}
-
};
-
-
class C:public A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from C"<<endl;
-
}
-
};
-
-
int main()
-
{
-
A* a = new A;
-
A* b = new B;
-
A* c = new C;
-
a->read();
-
b->read();
-
c->read();
-
return 0;
-
}
打印出来就分别read from A\B\C了……
这一点我还是觉得Java做的要好一些,避免了忘记用virtual修饰而造成的错误……
而纯虚函数 就是Java中的抽象方法了,和Java一样,C++中纯虚函数也必须在抽象类中定义,不过这个抽象类不用显式声明,只要类中有纯虚函数,则这个类自然会被认为是抽象类。样例如下:
-
#include<iostream>
-
using namespace std;
-
-
class A
-
{
-
public:
-
virtual void read() = 0;
-
};
-
-
class B:public A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from B"<<endl;
-
}
-
};
-
-
class C:public A
-
{
-
public:
-
void read()
-
{
-
cout<<"read from C"<<endl;
-
}
-
};
-
-
int main()
-
{
-
A* b = new B;
-
A* c = new C;
-
b->read();
-
c->read();
-
return 0;
-
}
此时如果想要 A* a = new A,在编译的时候会报错,提示不能创建一个抽象类的对象。
关于纯虚函数的定义 感觉有点不习惯, virtual 函数类型 函数名(参数列表) = 0; 还是Java中的会习惯一些。。