虚函数和纯虚函数的优缺点
时间: 2024-08-12 07:10:40 浏览: 118
虚函数和纯虚函数是面向对象编程中实现多态的关键机制。
1. **虚函数**:
- 优点:
- **动态绑定**: 当基类指针或引用调用虚函数时,实际执行的是派生类中的相应版本,这样可以实现运行时的行为选择,提高了代码的灵活性。
- **代码重用**: 基类定义的虚函数可以在派生类中被共享,减少了代码量。
- 缺点:
- **性能开销**: 每次虚函数调用都涉及到动态查找和类型检查,这可能对性能造成一定影响。
- 如果没有提供实现,子类必须覆盖虚函数,否则会导致编译错误。
2. **纯虚函数**:
- 优点:
- 强制继承: 一个类声明为纯虚函数,意味着必须由其派生类来实现,促使程序员为纯虚函数提供具体的实现。
- 提供接口: 纯虚函数主要用于定义抽象类,提供了一种标准的接口,所有派生类都必须实现这些方法。
- 缺点:
- 需要被派生类实现: 如果不被派生类覆盖,调用会抛出异常或编译错误,这可能增加代码复杂性。
- 不能直接实例化纯虚类,必须通过其派生类来创建对象。
相关问题
先建立一个职工类Employee,包含数据成员name(姓名),ID(编号),以他为基类,派生出经理类Manager和技术人员类Technician,在经理类中增加数据成员salary(月工资),在技术人员类中增加数据成员wage(代表每小时的工资)和hours(工作时长)。在定义类时,所有类中必须包含构造函数、析构函数、修改和获取所有数据成员的函数,以及虚函数计算职工的工资、输出职工的信息。且分析改代码的优劣
好的,根据你的要求,我给你编写一个C++程序:
```
#include <iostream>
#include <string>
using namespace std;
class Employee {
protected:
string name;
int ID;
public:
Employee(string n, int id) : name(n), ID(id) {}
virtual ~Employee() {}
virtual void printInfo() = 0;
virtual double calculateSalary() = 0;
string getName() const { return name; }
int getID() const { return ID; }
void setName(string n) { name = n; }
void setID(int id) { ID = id; }
};
class Manager : public Employee {
private:
double salary;
public:
Manager(string n, int id, double s) : Employee(n, id), salary(s) {}
void printInfo() {
cout << "Name: " << name << ", ID: " << ID << ", Salary: " << salary << endl;
}
double calculateSalary() {
return salary;
}
double getSalary() const { return salary; }
void setSalary(double s) { salary = s; }
};
class Technician : public Employee {
private:
double wage;
int hours;
public:
Technician(string n, int id, double w, int h) : Employee(n, id), wage(w), hours(h) {}
void printInfo() {
cout << "Name: " << name << ", ID: " << ID << ", Wage: " << wage << ", Hours: " << hours << endl;
}
double calculateSalary() {
return wage * hours;
}
double getWage() const { return wage; }
int getHours() const { return hours; }
void setWage(double w) { wage = w; }
void setHours(int h) { hours = h; }
};
int main() {
Employee *e1 = new Manager("John", 1234, 5000);
Employee *e2 = new Technician("Tom", 5678, 20, 160);
e1->printInfo();
cout << "Salary: " << e1->calculateSalary() << endl;
e2->printInfo();
cout << "Salary: " << e2->calculateSalary() << endl;
delete e1;
delete e2;
return 0;
}
```
这个程序中,我们定义了一个基类 `Employee`,并且在 `Manager` 和 `Technician` 中继承了 `Employee`。我们在 `Manager` 中增加了数据成员 `salary`,在 `Technician` 中增加了数据成员 `wage` 和 `hours`。我们在 `Employee` 中包含了纯虚函数 `printInfo()` 和 `calculateSalary()`,并且在 `Manager` 和 `Technician` 中重新定义了这两个函数。我们也提供了修改和获取所有数据成员的函数。
这个程序的优点是它采用了面向对象的设计思想,把不同职工的共性和个性进行了良好的封装和继承。这个程序具有良好的扩展性,可以方便地添加新的职工类。此外,程序也具有很好的可读性。
但是,这个程序也有一些缺点。例如,我们没有进行输入数据的操作,而是直接在程序中将数据写死。此外,我们也没有进行异常处理,如果输入的数据不合法,程序会崩溃。此外,在程序中使用了指针,我们需要手动管理内存,如果管理不当,会导致内存泄漏等问题。
c++动态多态特点以及优点和缺点
C++的动态多态是通过虚函数(virtual function)和纯虚函数(pure virtual function)实现的。其特点包括:
1. 运行时确定具体调用哪个函数。
2. 子类可以重写父类的虚函数,实现多态。
3. 虚函数必须通过指针或引用调用,不能通过对象调用。
其优点包括:
1. 可以提高程序的可扩展性和灵活性。
2. 使程序的接口更加清晰,易于理解和使用。
3. 可以实现多态,使得对象的类型可以在运行时确定,而不是在编译时确定。
其缺点包括:
1. 虚函数的调用效率较低,因为需要额外的时间和空间开销来维护虚函数表。
2. 虚函数的使用增加了程序的复杂度,需要更多的设计和开发时间。
3. 虚函数只能在类的内部使用,不能在全局范围内使用。
阅读全文