C/C++中虛基類詳解及其作用介紹
概述
虛基類 (virtual base class) 是用關(guān)鍵字 virtual 聲明繼承的父類.

多重繼承的問題
N 類:
class N {
public:
int a;
void display(){
cout << "A::a=" << a <<endl;
}
};
A 類:
class A : public N {
public:
int a1;
};
B 類:
class B : public N {
public:
int a2;
};
C 類:
class C: public A, public B{
public:
int a3;
void display() {cout << "a3=" << a3 << endl;};
};
main:
int main() {
C c1;
// 合法訪問
c1.A::a = 3;
c1.A::display();
return 0;
}
輸出結(jié)果:
A::a=3
存在的問題:
- A::a 和 B::a 是 N 類成員的拷貝
- A::a 和 B::a 占用不同的空間

虛基類
我們希望繼承間接共同基類時(shí)只保留一份成員, 所以虛基類就誕生了. 當(dāng)基類通過多條派生路徑被一個(gè)派生類繼承時(shí), 該派生類只繼承該基類一次.
語法:
class 派生類名: virtual 繼承方式 基類名
初始化
通過構(gòu)造函數(shù)的初始化表對虛擬類進(jìn)行初始化. 例如:
N 類:
class N {
public:
int n;
N(int n) : n(n) {};
};
A 類:
class A : virtual public N {
public:
A(int n) : N(n) {};
};
B 類:
class B : virtual public N {
public:
B(int n) : N(n) {};
};
C 類:
class C: public A, public B{
public:
C(int n) : N(n), A(n), B(n){};
};
例子
Person 類:
#ifndef PROJECT5_PERSON_H
#define PROJECT5_PERSON_H
#include <iostream>
#include <string>
using namespace std;
class Person {
protected:
string name;
char gender;
public:
Person(string n, char g) : name(n), gender(g) {}
void display() {
cout << "name: " << name << endl;
cout << "gender: " << gender << endl;
}
};
#endif //PROJECT5_PERSON_H
Student 類:
#ifndef PROJECT5_STUDENT_H
#define PROJECT5_STUDENT_H
#include <string>
#include "Person.h"
using namespace std;
class Student : virtual public Person {
protected:
double score;
public:
Student(string n, char g, double s) : Person(n, g), score(s) {};
};
#endif //PROJECT5_STUDENT_H
Teacher 類:
#ifndef PROJECT5_TEACHER_H
#define PROJECT5_TEACHER_H
#include <string>
#include "Person.h"
using namespace std;
class Teacher : virtual public Person {
protected:
string title;
public:
Teacher(string n, char g, string t) : Person(n, g), title(t) {};
};
#endif //PROJECT5_TEACHER_H
Graduate 類:
#ifndef PROJECT5_GRADUATE_H
#define PROJECT5_GRADUATE_H
#include "Teacher.h"
#include "Student.h"
#include <string>
using namespace std;
class Graduate : public Teacher, public Student{
private:
double wage;
public:
Graduate(string n, char g, double s, string t, double w) : Person(n, g), Student(n, g, s), Teacher(n, g, t), wage(w) {};
void display() {
Person::display();
cout << "score: " << score << endl;
cout << "title: " << title << endl;
cout << "wages: " << wage << endl;
};
};
#endif //PROJECT5_GRADUATE_H
main:
#include <iostream>
#include "Graduate.h"
using namespace std;
int main() {
Graduate grad1("小白",'f',89.5,"教授",1234.5);
grad1.display();
return 0;
}
輸出結(jié)果:
name: 小白
gender: f
score: 89.5
title: 教授
wages: 1234.5
總結(jié)
- 使用多重繼承時(shí)要十分小心, 否則會進(jìn)場出現(xiàn)二義性問題
- 不提倡在程序中使用多重繼承
- 只有在比較簡單和不易出現(xiàn)二義性的情況或?qū)嵲诒匾獣r(shí)才使用多重繼承
- 能用單一繼承解決的問題就不要使用多重繼承

到此這篇關(guān)于C/C++中虛基類詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++虛基類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
超詳細(xì)VScode調(diào)試教程tasks.json和launch.json的設(shè)置
vscode是一個(gè)輕量級的文本編輯器,但是它的擴(kuò)展插件可以讓他拓展成功能齊全的IDE,這其中就靠的是tasks.json和launch.json的配置,下面這篇文章主要給大家介紹了關(guān)于超詳細(xì)VScode調(diào)試教程tasks.json和launch.json設(shè)置的相關(guān)資料,需要的朋友可以參考下2022-10-10
基于C語言實(shí)現(xiàn)的TCP服務(wù)器的流程分析
本文詳細(xì)介紹了如何使用C語言編寫一個(gè)簡單的TCP服務(wù)器,包括創(chuàng)建套接字、綁定IP和端口、監(jiān)聽連接請求、接受客戶端連接、數(shù)據(jù)接收與發(fā)送以及關(guān)閉套接字等步驟,最后通過一個(gè)簡單的示例展示了TCP服務(wù)器的基本實(shí)現(xiàn)過程2024-10-10
簡單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)
桶排序是將要排序的算法按桶分組排序之后再遍歷匯總的一種線性排序算法,下面就讓我們來通過小例子簡單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)^^2016-07-07

