为啥结果是0
#include<iostream>
using namespace std;
class Shape
{
public :
void draw();
};
void Shape::draw()
{
cout<<"0"<<"\n";
}
class Line:public Shape
{
public :
void draw();
};
void Line::draw()
{
cout<<"1"<<"\n";
}
void main()
{
Shape *s= new Line();
s->draw();
delete s;
}
[解决办法]
因为父类没加关键字virtual。
[解决办法]
将父类draw函数定义为virtual,这样子类可以重新定义draw函数,调用时会调用子类的draw,如果不加该关键字只会调用父类的draw函数。
[解决办法]
编译器没有那么聪明,能知道它的实际对象就是子类,它只看到父类的方法。于是有一种技术叫多态的玩意,多态将一些被virtual修饰的方法,放到一个地方存储起来。当你用父类指针对象,调用这类virtual方法,它会在那个地方,取出正确的那个方法调用。
[解决办法]
这里不存在虚表,所有的东西都在编译的时候就决定了,shape的对象只能调用shape类的代码段的函数,所以你这里只能调到shape自己的函数;
如果你在shape的Draw前面加上一个virtual,这个时候shape的每个对象的第一个地址处会放一个指针,该指针指向一个虚表,虚表里面是具体的函数入口。这时,shape指针指向了一个Line对象,而Line对象的虚表指针指向的是Line的虚函数表,就可以找到Line的Draw函数了;
建议看看多态;