【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析
- 游戏开发
- 2025-08-17 14:45:01

在派生类中定义一个虚函数 定义派生类时: 将基类中的虚函数覆盖掉:派生类提供新定义,所声明的函数原型必须完全符合基类所声明的函数原型(包括:参数列表、返回类型、常量性);原封不动继承基类中的虚函数;如果继承的是纯虚函数,则这个派生类也会被视为抽象类,无法为它定义任何对象。 在派生类中,如果其基类的同名成员函数已声明为虚函数,则派生类的同名成员函数声明和定义前不用加virtual,即为了覆盖基类的某个虚函数,而进行函数声明时,不一定得加上关键字virtual,编译器会自动根据两个同名函数的原型声明,决定某个函数是否会覆盖其基类中的同名函数。 class num_sequence{ public: virtual const char*what_am_i()const{return "num_sequence\n";} //... }; class Fibonacci : public num_sequence{ public: virtual const char* what_am_i(){return "Fibonacci\n";} //编译器报错:基类声明为const,派生类却是non-const //... }; 返回类型必须完全吻合“的一个例外——当基类的虚函数返回某个基类形式(通常是指针或者引用)时,派生类中的同名函数便可以返回该基类所派生出来的类型: class num_sequence{ public: //我们想让派生类的clone()函数可返回一个指针, //指向基类num_sequence的任何一个派生类 virtual num_sequence *clone() = 0; //... }; class Fibonacci : public num_seuqence{ public: //派生类同名函数不用加virtual Fibonacci *clone(){return new Fibonacci(*this);} //... }; 虚函数的静态解析
为了能够在“单一对象中展现多种类型”,多态需要一层间接性。在C++中,唯有用基类的指针和引用才能够支持面向对象编程概念
虚函数机制无用的两种情况:
基类的构造函数和析构函数里;使用的是基类的对象,而非基类对象的指针或引用。所以,在基类的构造函数中,派生类的虚函数绝对不会被调用;基类的析构函数同理。
示例分析:
以下代码中,AudioBook是基类LibMat的派生类,print()在类继承体系中是个虚函数: void print(LibMat object, const LibMat *pointer, const LibMat &reference) { //以下必定调用LibMat::print() object.print(); //以下一定会通过虚函数机制来解析, //我们无法预知哪一份print()会被调用 pointer->print(); reference.print(); } 当我们为基类声明一个实际对象(如print()的第一个参数),同时也就分配出了足以容纳该实际对象的内存空间;如果稍后传入的是个派生类对象,那就没有足够的内存放置派生类中的各个数据成员,例如我们将AudioBook对象传给print(): int main() { AudioBook iWish("Her pride of 10", "Stanley Lippman", "Jeremy Irons"); print(iWish, iWish, iWish); //... } 只有iWish内的“基类子对象(也就是属于LibMat的成分)”被复制到“为参数对象而保留的内存”中;其他的子对象(AudioBook成分)则被切掉了;至于另外两个参数:const LibMat *pointer和const LibMat &reference,则被初始化为iWish对象所在的内存地址;这就是它们能够指向完整的AudioBook对象的原因。【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析”