永发信息网

继承与虚函数的区别?

答案:3  悬赏:50  手机版
解决时间 2021-04-07 18:15
  • 提问者网友:呐年旧曙光
  • 2021-04-07 07:45
class A
{
public:
virtual void foo() { cout < < "A::foo() is called " < < endl;}
};

class B: public A
{
public:
virtual void foo() { cout < < "B::foo() is called " < < endl;}
};
我不用虚函数,用继承的成员限定符也可以访问多个呀?请告诉说明?
B b;
b.foo();
b::a.foo();
这不是也达到了虚函数的作用了吗?
最佳答案
  • 五星知识达人网友:几近狂妄
  • 2021-04-07 08:13
虚函数不是为了访问多个这么简单。
虚函数主要目的是为了实现程序的多态性。
例如:
A a0;
B b0;
A* a = &a0, aa = &b0;
//函数:
void display(A a){}
//调用
display(&a);//显示A::foo() is called
display(&aa);//显示B::foo() is called
传入参数都是类A的对象。这个过程就是一个多态性的体现,三个条件(1)有继承(2)父类指针指向子类对象如例子中的aa指针对象实际上是类B的(3)子类重写了父类方法如例子中的foo方法
好处就是使用一个方法display可以调用A和B的对象,
要display类B不需要再写一个函数比如
void displayB(B b){}
不过这只是多态表面上的意思。。。。。。深入理解查阅多态相关知识
全部回答
  • 1楼网友:等灯
  • 2021-04-07 11:08
达不到 使用虚函数是为了实现面向对象的特性,这里指不同的对象在进行相同的行为时会有不同的结果 例如: 以上面的代码做出以下程序: A * getClass(int nT) { if(!nT) return new A(); else return new B(); } int main() { int nT(0); A * p( NULL); cin>>nT; p = getClass(nT); p->foo(); delete p; return 0; } 这里不考虑getClass怎么实现,只知道A继承体系下提供了foo接口,nT不同是调用之后会有不同的结果,这样可以简化结构,提高效率,假如以后又写了A的子类C类,,那么这个时候只需要修改getClass函数即可实现不同函数的调用 即程序主体框架不变的情况下,通过更换不同的子类即可得到不同的效果,开发效率大幅度提高 你的程序是硬编码,复用性差,假如以后有新的子类出现,又要写c::a.foo();需要修改大量的代码,使用虚函数只修改获得子类的部分即可
  • 2楼网友:举杯邀酒敬孤独
  • 2021-04-07 09:38
简单地说函数的重载只会发生在一个类中 覆盖 1.基函数必须是虚函数 2.发生覆盖的两个函数要分别位于派生类与基类中 3.函数名称与参数列表必须完全相同 由于c++的多态性是通过虚函数来实现的,所以函数的覆盖总是和多态关联在一起 c++多态性体现在虚函数中也就是说编译时无法确定类型,而在运行时根据实际的类型对象调用相应的函数 还有派生类的函数与基类的函数完全相同,只是基类的函数没有使用virtual关键字,此时基类的函数将被隐藏,而不是覆盖 派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有virtual关键字,基类的函数都将被隐藏,注意这种情况与函数重载的区别
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯