1.虚函数与多态
以下为AI生成
虚函数是C++中实现多态性的一种机制。多态性允许一个类的对象可以以多种不同的方式工作,即同一个函数可以根据对象的不同类型表现出不同的行为。
在C++中,通过在基类中声明虚函数,并在派生类中进行重写,可以实现多态性。当通过基类指针或引用调用虚函数时,会根据指针或引用所指向的对象的实际类型来确定调用哪个类的虚函数。
以下是虚函数与多态的一些关键点:
- 虚函数:在基类中使用
virtual
关键字声明的成员函数被称为虚函数。派生类可以对虚函数进行重写,实现自己的版本。- 动态绑定:通过基类指针或引用调用虚函数时,会根据指针或引用所指向的对象的实际类型来确定调用哪个类的虚函数。这种在运行时确定函数调用的机制称为动态绑定。
- 纯虚函数:在基类中使用
virtual
关键字声明且没有实现的函数被称为纯虚函数。纯虚函数必须在派生类中进行重写才能创建对象。- 虚析构函数:当基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数。为了确保正确释放派生类对象的资源,需要将基类的析构函数声明为虚函数。
虚函数函数与多态
对于我来说,虚函数就是函数前面加virtual,多态就是子类重写父类虚函数。
1.class People
class People { public: static int a; People() {} virtual void print() { cout<<"调用People的函数" << endl; } }; int People::a = 1;
2.class MM
class MM :public People { public: MM() {} MM(int age,string name):age(age),name(name) {} void print() { cout << "调用MM的函数" << endl; //说明static变量也可以继承 cout << "静态变量:"<<a<< endl; } private: int age; string name; };
3.main
int main() { MM mm(10,"网"); mm.print(); return 0; }
结果:
2.抽象类,纯虚函数
纯虚函数:virtual void print()=0; 注意后面要等于0
抽象类:类中全为纯虚函数
你是公司的底层程序员,那么就是你继承抽象类然后实现。。牛马的一生。
1.class People
class People {//抽象类 public: virtual void print() = 0; virtual void print1() = 0;//纯虚函数 };
2.class MM
class MM :public People{ public: void print() { cout<<"调用print函数" << endl; } void print1() { cout << "调用print1函数" << endl; } ~MM() { cout << "调用MM析构函数" << endl; } };
3.main
int main() { MM mm; mm.print(); mm.print1(); return 0; }
结果:
补充:使用new创建
1.new创建不delete
结果:不调用析构函数
2.new创建delete结果:调用析构函数
3.虚析构函数
1.class People
class People {//抽象类 public: ~People() { cout << "调用People析构函数" << endl; } virtual void print() = 0;//纯虚函数 };
2.class MM:public People
class MM :public People{ public: MM() {} ~MM() { cout << "调用MM析构函数" << endl; } void print() {} };
3.main
(1)MM* mm=new MM;
int main() { MM* mm=new MM; //释放 delete mm; mm = nullptr; return 0; }
(2)People* mm=new MM;这是多态的写法,基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数。
显然有错,使用MM(子类)来创建People(父类)对象,在析构的时候没有析构子类,解决方法是使用virtual修饰People(父类)的析构函数。如(3)
int main() { People* mm=new MM; //释放 delete mm; mm = nullptr; return 0; }
(2)People* mm=new MM;
int main() { People* mm=new MM; //释放 delete mm; mm = nullptr; return 0; }