虚函数有什么作用啊?和多态性有什么关系?
最近学面向对象时有点模糊,虚函数做什么用的?另外OOP,MDA,DDA是具体那些思想啊,谁能解决我的迷惑啊?谢谢了?...
最近学面向对象时有点模糊,虚函数做什么用的?另外OOP,MDA,DDA是具体那些思想啊,谁能解决我的迷惑啊?谢谢了 ?
展开
展开全部
虚函数最大的好处是可以保持驱动程序的变量数据在增加派生类后可以不发生修改,已经统一程序接口,如:
1.
class B
{
public:
virtual void Run()=0;
};
class A : public B
{
public:
virtual void Run(){ cout<<"run A"<<endl; }
};
class C: public B
{
public:
virtual void Run(){ cout<<"run B"<<endl; }
};
现在有一个驱动模块,如类 Drv
class Drv
{
public:
void Execute()
{
b->Run();
}
private:
B *b;
};
即使以后派生类扩展了,这个驱动程序的数据程序,已经主要函数基本不做修改,使得出错率降低。如果不用虚函数,可能的代码为:
class Drv
{
public:
void Execute()
{
switch(a)
{
case 0: a.Run(); break;
case 1: c.Run(); break;
//以后可能还要增加其它派生类对象
}
}
private:
int sel
A a;
B b;
//以后可能还要增加其它派生类对象
};
显然每增加一个派生类,就要对上面做多处修改!!!
2. 通用接口,如:
void Execute(B &b)
{
b.Run();
}
这样可以使用如:
A a;
Execute(a);
C c;
Execute(c);
使得程序降低,否则需要定义给每个类为参数的函数,如:
void Execute(A &a)
{
a.Run();
}
void Execute(C &c)
{
c.Run();
}
上面的两个例子可以看到虚函数的好处!!
1.
class B
{
public:
virtual void Run()=0;
};
class A : public B
{
public:
virtual void Run(){ cout<<"run A"<<endl; }
};
class C: public B
{
public:
virtual void Run(){ cout<<"run B"<<endl; }
};
现在有一个驱动模块,如类 Drv
class Drv
{
public:
void Execute()
{
b->Run();
}
private:
B *b;
};
即使以后派生类扩展了,这个驱动程序的数据程序,已经主要函数基本不做修改,使得出错率降低。如果不用虚函数,可能的代码为:
class Drv
{
public:
void Execute()
{
switch(a)
{
case 0: a.Run(); break;
case 1: c.Run(); break;
//以后可能还要增加其它派生类对象
}
}
private:
int sel
A a;
B b;
//以后可能还要增加其它派生类对象
};
显然每增加一个派生类,就要对上面做多处修改!!!
2. 通用接口,如:
void Execute(B &b)
{
b.Run();
}
这样可以使用如:
A a;
Execute(a);
C c;
Execute(c);
使得程序降低,否则需要定义给每个类为参数的函数,如:
void Execute(A &a)
{
a.Run();
}
void Execute(C &c)
{
c.Run();
}
上面的两个例子可以看到虚函数的好处!!
展开全部
虚函数提供了一种面向对象的机制可以让继承类重写其中方法,虚函数有方法体。以提供灵活的机制让继承类实现自己的函数方法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虚函数可以被重载(override)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a virtual function will be binded only at run time, not in compile stage.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询