①在某一个父类中定义了一个虚函数。在子类中给出具体定义。
②在某一个父类中定义一个函数,但是函数体为空。然后在子类中给出具体定义。
这样2个有区别吗?我觉得没有啊。虽然说,第一个是叫做后绑定,第二个叫做重定义。
| 您还可以输入9999 个字 |
满意回答
检举|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、为什么能够通过指针来调用不同的函数呢?实在不明白。。跪求
转载于:https://blog.51cto.com/lihaichuan/1097270
本文解析了C++中虚函数与重定义的区别,重点介绍了虚函数如何支持多态及其实现机制,并通过实例对比了两种方式的不同效果。
2289

被折叠的 条评论
为什么被折叠?



