C++中虚基类
时间:2022-06-17
本文章向大家介绍C++中虚基类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
摘自《C++程序设计》
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。 C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员。
下面举例说明: 在如下的图中:
Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类。 如果使用虚基类的话,Graduate将有两份age拷贝,两份gender拷贝,两份name拷贝,一个来自Student,一个来自Teacher。即Student::age,Teacher::age,Student::gender,Teacher::gender,Student::name,Teacher::name,如果不使用虚基类,我们可以在Graduate以类名::类成员的形式对同名成员进行访问。但是显示,这我不是我们希望的,同样的副本我们只需要一份。所以C++中提出了虚基类的实现方式。 声明虚基类的一般形式是:
class 派生类名:virtual 继承方式 基类名称
下面是上面实例的代码: 类声明person.h:
#pragma once
#include <string>
using namespace std;
class Person
{
protected:
string name;
char gender;
int age;
public:
Person(string name, char gender, int age);
};
class Teacher : virtual public Person
{
protected:
string title;
public:
Teacher(string name, char gender, int age, string title);
};
class Student: virtual public Person
{
protected:
double score;
public:
Student(string name, char gender, int age, double score);
};
class Graduate : public Teacher, public Student
{
private:
double wage;
public:
Graduate(string name, char gender, int age, double score, string title, double wage);
void show();
};
类实现person.cpp:
#include <iostream>
#include "person.h"
Person::Person(string name, char gender, int age)
{
this->name = name;
this->gender = gender;
this->age = age;
}
Teacher::Teacher(string name, char gender, int age, string title) : Person(name, gender, age)
{
this->title = title;
}
Student::Student(string name, char gender, int age, double score) : Person(name, gender, age)
{
this->score = score;
}
Graduate::Graduate(string name, char gender, int age, double score, string title, double wage) : Person(name, gender, age), Teacher(name, gender, age, title), Student(name, gender, age, score)
{
this->wage = wage;
}
void Graduate::show()
{
cout << "name: " << name << 'n';
cout << "age: " << age << 'n';
cout << "gender: " << gender << 'n';
cout << "score: " << score << 'n';
cout << "title: " << title << 'n';
cout << "wage: " << wage << endl;
}
int main()
{
Graduate graduate("tanzhenyu", 'M', 25, 85, "manager", 10000);
graduate.show();
return 0;
}
运行结果:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法