前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++中虚基类

C++中虚基类

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 11:39:23
6120
发布2019-01-22 11:39:23
举报

摘自《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++中提出了虚基类的实现方式。 声明虚基类的一般形式是:

代码语言:javascript
复制
class 派生类名:virtual 继承方式 基类名称

下面是上面实例的代码: 类声明person.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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;
}

运行结果:

运行结果
运行结果
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年05月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档