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();
这不是也达到了虚函数的作用了吗?
继承与虚函数的区别?
答案:3 悬赏:50 手机版
解决时间 2021-04-07 18:15
- 提问者网友:呐年旧曙光
- 2021-04-07 07:45
最佳答案
- 五星知识达人网友:几近狂妄
- 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){}
不过这只是多态表面上的意思。。。。。。深入理解查阅多态相关知识
虚函数主要目的是为了实现程序的多态性。
例如:
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关键字,基类的函数都将被隐藏,注意这种情况与函数重载的区别
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯