1. 程式人生 > >c++筆記之虛基類&菱形繼承

c++筆記之虛基類&菱形繼承

簡單例子:

#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。