c++ 虚基类(好理解)

当有类Base,类Base1继承了Base,Base2也继承了Base,Derived 类多继承了Base1和Base2

也就是呈现如图一种继承关系

 如果Base类有一个public的 int a ,在Derived里面要访问这个a,就必须指定是哪个类的a(Base1或者Base2),那就得用作用域符::来指定

如下:

 虚基类就是用来解决这个问题

虚基类时这样子来声明:

 此时Base类就是Base1的虚基类

将上面的继承关系变成:

此时Derived类继承的a就只有一个,那这一个a是哪一个呢?

其实这个a的值与这些类的构造器有关

我将构造器进行如下的书写:

 在这里要补充一下构造器的调用顺序:虚基类->基类->子类

 

 那么下面来分析Derived中的a应该等于多少:

首先,在Base类中定义了int  a = 10;

当创建一个Derived对象时,先调用Base的构造器,此时a = a + 1,那就是11,再调用 Base1的构造器 a = a + 10, 此时a = 21, 再调用Base2的构造器, a = a + 20, 此时a = 41,所以Derived类中继承下来的a 就是41

输出一下:确实是41

 当然,同理,如果各个类的构造器都没有对a进行处理,那a的值就还是虚基类Base原来的值10

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您解答这个问题。首先,我们需要定义一个基类`Employee`,它包含员工的基本信息和计算工资的函数: ```cpp class Employee { public: Employee(const std::string& name, int age, double salary) : name_(name), age_(age), salary_(salary) {} virtual ~Employee() {} virtual double getSalary() const = 0; // 纯虚函数,计算工资 std::string getName() const { return name_; } int getAge() const { return age_; } double getSalaryBase() const { return salary_; } protected: std::string name_; int age_; double salary_; }; ``` 接下来,我们定义派生类`Manager`和`Programmer`,它们分别表示经理和程序员,实现计算工资的函数: ```cpp class Manager : public virtual Employee { public: Manager(const std::string& name, int age, double salary, double bonus) : Employee(name, age, salary), bonus_(bonus) {} virtual ~Manager() {} virtual double getSalary() const override { return salary_ + bonus_; } protected: double bonus_; // 经理的奖金 }; class Programmer : public virtual Employee { public: Programmer(const std::string& name, int age, double salary, int hours) : Employee(name, age, salary), hours_(hours) {} virtual ~Programmer() {} virtual double getSalary() const override { return salary_ * hours_; } protected: int hours_; // 程序员的工作小时数 }; ``` 注意到这里我们使用了虚继承,避免了多重继承带来的问题。 最后,我们可以定义一个`Company`类,用于存储员工信息和计算公司总工资: ```cpp class Company { public: Company() {} ~Company() {} void addEmployee(Employee* employee) { employees_.push_back(employee); } double getTotalSalary() const { double total = 0.0; for (auto employee : employees_) { total += employee->getSalary(); } return total; } private: std::vector<Employee*> employees_; }; ``` 这样,我们就可以使用这些类来实现一个小型公司的工资管理程序了。例如,我们可以这样使用: ```cpp int main() { Company company; Employee* employee1 = new Manager("Alice", 30, 5000.0, 1000.0); Employee* employee2 = new Programmer("Bob", 25, 200.0, 160); company.addEmployee(employee1); company.addEmployee(employee2); double totalSalary = company.getTotalSalary(); std::cout << "Total salary: " << totalSalary << std::endl; delete employee1; delete employee2; return 0; } ``` 输出结果: ``` Total salary: 33200 ``` 希望这个示例代码能够帮助您理解如何用 C++ 虚基类编写一个小型公司的工资管理程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值