日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 虚基类

發布時間:2024/3/12 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 虚基类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++ 虛基類

  • 概述
  • 多重繼承的問題
  • 虛基類
    • 初始化
    • 例子
  • 總結

概述

虛基類 (virtual base class) 是用關鍵字 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; }

輸出結果:

A::a=3

存在的問題:

  • A::a 和 B::a 是 N 類成員的拷貝
  • A::a 和 B::a 占用不同的空間

虛基類

我們希望繼承間接共同基類時只保留一份成員, 所以虛基類就誕生了. 當基類通過多條派生路徑被一個派生類繼承時, 該派生類只繼承該基類一次.

語法:

class 派生類名: virtual 繼承方式 基類名

初始化

通過構造函數的初始化表對虛擬類進行初始化. 例如:

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; }

輸出結果:

name: 小白 gender: f score: 89.5 title: 教授 wages: 1234.5

總結

  • 使用多重繼承時要十分小心, 否則會進場出現二義性問題
  • 不提倡在程序中使用多重繼承
  • 只有在比較簡單和不易出現二義性的情況或實在必要時才使用多重繼承
  • 能用單一繼承解決的問題就不要使用多重繼承

總結

以上是生活随笔為你收集整理的C++ 虚基类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。