①在某一个父类中定义了一个虚函数。在子类中给出具体定义。
②在某一个父类中定义一个函数,但是函数体为空。然后在子类中给出具体定义。
这样2个有区别吗?我觉得没有啊。虽然说,第一个是叫做后绑定,第二个叫做重定义。
我来帮他解答
 
图片
 
 
符号
 
 
编号
 
 
排版
 
 
地图
 您还可以输入9999 个字
您提交的参考资料超过50字,请删除
 
参考资料:
匿名 提交回答
满意回答
检举|2011-03-18 11:15
有区别,虚函数的特性是用于实现多态的。

比如以下代码

class A{
public:
void print(){ cout<<”This is A”<<endl;}
};
class B:public A{
public:
void print(){ cout<<”This is B”<<endl;}
};
int main(){ //为了在以后便于区分,我这段main()代码叫做main1
A a;
B b;
a.print();
b.print();
}

如果通过这种方式 不通过虚函数的方法,输出的会是 This is A和This is B。因为a,b指针类型分别为A和B。

但是如果修改main为

int main(){ //main2
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}

这样的话 输出就会为两个This is A。因为不管是p1 还是p2的指针类型都是A*,指向的是A类的方法调用(方法不同于对象,是在编译类时编译,会在即使未创建该类对象,依旧可以使用其方法)。

这个时候如果你使用的A中的方法为虚函数,这里结果就完全不同。

被声明为虚函数的函数,会在继承的子类中被覆盖。不同于属性的是,方法为覆盖,属性为隐藏。
具体在c++中的实现是通过一个虚函数表完成的(详细请查阅更多资料,网上很多

)。

这样我们再定义
class A{
public:
virtual void print(){ cout<<”This is A”<<endl;} //现在成了虚函数了
};
class B:public A{
public:
void print(){ cout<<”This is B”<<endl;} //这里需要在前面加上关键字virtual吗?
};

这次类A中的方法通过virtual 修饰后,作为对象被创建时就会被覆盖掉。

再次执行
int main(){ //main2
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}

输出就会是A 和B了
追问
是不是这样的?
1、你讲的道理我是懂了,就像是一个父类为 宠物 ,然后派生出来 狗 这个子类,他们都有一个名字,如果我用重定义的话,狗,就只有狗这个名字了。 但是用虚函数的话,我还可以在适当的时候调出 狗的另外一个名字 宠物。
2、书上说,继承下来的虚函数,子类那个vitural可以要,也可以不要。那样的话,就都是他们的虚函数都只是使用自己的定义了。
3、为什么能够通过指针来调用不同的函数呢?实在不明白。。跪求
回答
2、书上说,继承下来的虚函数,子类那个vitural可以要,也可以不要。那样的话,就都是他们的虚函数都只是使用自己的定义了。

这个子类如果用vitural 关键字,则这个子类的子类的方法也可以被覆盖。
3、为什么能够通过指针来调用不同的函数呢?实在不明白。。跪求
指针是指向一段内存地址,这个内容详细你可以看

文章 你就知道 函数指针是什么时候以何种形式被调用了

参考资料:http://baike.baidu.com/view/161302.htm#5