在父类里使用virtual关键字来修饰成员函数,这样的函数称之为虚函数。其作用主要用于子类覆盖父类的同名方法。然后通过基类指针或引用来访问派生类或基类的同名方法。同时用虚函数可以实现OOP里的多态机制。
下面的示例是利用虚函数实现OOP里的多态机制:
#include<iostream>using namespace std;
class Parent
{
public:
Parent(){}
virtual void Foo(){
cout << "default for parent" << endl;
}
~Parent(){};
private:
};
class Chlid :public Parent{
public:
Chlid(){}
// 重写父类的同名方法Foo
void Foo(){
cout << "default for child" << endl;
}
private:
};
class Chlid2 :public Parent{
public:
Chlid2(){}
// 重写父类的同名方法Foo
void Foo(){
cout << "default for child2" << endl;
}
private:
};
int main(int argc, char argv[])
{
// 实现C++里的多态机制
Parent parent[2];
parent[0]=new Chlid();
parent[1] = new Chlid2();
for (int i = 0; i < 2; i++){
parent[i]->Foo();
}
return 0;
}
另外,没听说过C++有实函数这一概念。
有一个汽车,有4个轮子,一个车架,4个坐位,一个方向盘。。。。
现在我们要造一个小汽车,我们发现上面的轮子,方向盘用来造小汽车刚合适,所以我们就直接拿来用就是了,但车架和坐位不合适,这时,我们就要重新造车架和坐位。
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
虚函数是在基类中作总体框架定义,定义时在函数的返回类型名前加上virtual构成。它的具体不同实现版本是在其类的派生类里实现的。纯虚函数是在其类中连基本框架都定义不出来,所以只是用“virtual 类型名 函数名()=0;”的形式来声明基类中有这么一个函数,而它的实现则完全由基类的派生类根据不同需要来完成。有纯虚函数的基类叫抽象类,不能被实例化(即不能生成对象),只能被继承。我的理解是:虚函数实现的具体版本中总是有通用的部分,这些通用部分可以在基类中定义,而纯虚函数则完全没有能共用的部分,完全是由派生类中不同的实现完成的。供参考……
作用:虚函数的作用就是将接口(函数调用)与实现(函数定义)分开, 就是实现所谓的多态行为。也就是说虚函数提供了让你修改基类函数定义的机会。这里虽然你定义了一个派生类但是这个派生类任然可以按照基类的方式使用,即将派生类对象传递给需要基类引用、指针的函数。
定义: 在一个类中,一个由virtual 关键字修饰的函数声明表示这个函数声明所对应的函数调用既要服务于本类中的函数定义也要服务于派生类中的函数定义,相当于一个接口的作用。
一段良好的代码通常只使用基类提供的接口来编写,那些与派生类相关的代码单独放在一个地方(工厂)。
例子:
class Window {
public:
virtual void drawEvent(void event); /
virtual void keyEvent(void event);
virtual void mouseEvent(void event);
virtual void addWindow(Window window);
void show();
virtual ~Window(); // 用到继承, 基类的析构函数必须声明为虚函数,否则是逻辑错误
};
class Button : public Window {
public:
// 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
void drawEvent(void event);
void keyEvent(void event);
void mouseEvent(void event);
void setText(const std::string label);
};
class Menu;
class MenuBar : public Window {
public:
// 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
void drawEvent(void event);
void mouseEvent(void event);
void addWindow(Window m);
};
class Menu : public Window {
public:
// 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
void drawEvent(void event);
void mouseEvent(void event);
void keyEvent(void event);
};
void userCode(Window &win, Window &win2) {
winaddWindow(win2); //用户代码只用到了基类的引用
}
int main() {
Window mainWindow();
MenuBar menuar();
Menu fileMenu();
Button button();
usrCode(mainWindow, menuBar); //将MenuBar对象当做Window引用来使用,由于定义了虚函数,所以usrCode会使用我们重定义的代码
usrCode(menuBar, fileMenu); //
usrCode(mainWindow, button); //
mainWindowshow();
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)