c++筆記之虛基類&菱形繼承
阿新 • • 發佈:2018-10-31
簡單例子:
#include <iostream> #include <string> using namespace std; class Person { public: Person(string nam, char s, int a) { name = nam; sex = s; age = a; } protected: string name; int age; char sex; }; class Teacher :virtual public Person { public: Teacher(string nam, char s, int a, string t) :Person(nam, s, a) { title = t; } protected: string title; }; class Student :virtual public Person { public: Student(string nam,char s,int a,float sco):Person(nam,s,a),score(sco){} protected: float score; }; class Graduate :public Teacher, public Student { public: Graduate(string nam,char s,int a,string t,float sco,float w) :Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w){} void show() { //這裡之所以不存在二義性是因為這個菱形繼承是虛基類繼承, //虛基類繼承時c++只執行最後的派生類Grauate對虛基類的建構函式的呼叫, //忽略虛基類的其他派生類的建構函式的呼叫, //這保證了公共基類的資料成員不會被多次初始化。 cout << "name: " << name << endl; cout << "age: " << age << endl; cout << "sex; " << sex << endl; cout << "score: " << score << endl; cout << "title: " << title << endl; cout << "wages: " << wage << endl; } private: float wage; };
// practice.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
#include "pch.h"
#include "Person.h"
#include <iostream>
using namespace std;
int main()
{
Graduate grad("Wang_li", 'f', 24, "assistant", 89.5, 1200);
grad.show();
system("pause");
return 0;
}
這是一個菱形繼承,Teacher和Student都繼承於Person類,並且Person都是作為兩者的虛基類,Graduate繼承於Student和Teacher類,這時虛基類的優點就發揮出來了,Graduate負責對虛基類Person的初始化,忽略Student和Teacher對Person建構函式的呼叫,避免多次初始化。Graduate只保留了基類的成員,所以不會產生二義性並且解決菱形繼承帶來的資料冗餘。如果只是普通繼承,需要指明name這些成員的類域,不然編譯器就不知道是哪個類的成員。
感謝我的朋友--小樊。
現在我的排名是1233662。