男孩子怎么做网站,推广引流渠道有哪些,wordpress制作模板,wordpress 男孩同志在派生类中定义一个虚函数
定义派生类时#xff1a;
将基类中的虚函数覆盖掉#xff1a;派生类提供新定义#xff0c;所声明的函数原型必须完全符合基类所声明的函数原型#xff08;包括#xff1a;参数列表、返回类型、常量性#xff09;#xff1b;原封不动继承基类…在派生类中定义一个虚函数
定义派生类时
将基类中的虚函数覆盖掉派生类提供新定义所声明的函数原型必须完全符合基类所声明的函数原型包括参数列表、返回类型、常量性原封不动继承基类中的虚函数如果继承的是纯虚函数则这个派生类也会被视为抽象类无法为它定义任何对象。
在派生类中如果其基类的同名成员函数已声明为虚函数则派生类的同名成员函数声明和定义前不用加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://派生类同名函数不用加virtualFibonacci *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对象的原因。