欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二义性 , 虚基类 virtual

程序员文章站 2022-05-13 19:10:22
...

二义性:向一个对象发送消息不明确。
发送消息:对象.成员

1、单继承:父子继承时,出现同名现象
    Class a;
    Class b:public a
    作用域的屏蔽:子类会屏蔽父类
解决二义性:作用域
    b.父类::父类成员

2、重写(覆盖):如果父子类出现同名且同形参方法,子类的作用域会覆盖父类。
  注:父类还是存在  

3、虚基类:
      关键字:   virtual 
      解决问题:防止公共基类中多继承中出现重复继承
        class A
        {
        };
        class B :virtual public A
        {
        }
        class C:virtual public A
        {
        };
        class  D:public B,public C   在D中出现公共基类问题
        {
        };
        注: 初始化必须由该子类(D:包含公基类)来构造公基类

#include<iostream>
#include<string>
using namespace std;
//共基类
class people
{
public:
	//无参构造器
	people(){}
	people(int i,const char* n):id(i),name(n)
	{
	}
	void show()
	{
		cout<<"people::"<<"id:"<<id<<" name:"<<name;
	}
protected:
	int id;
	string name;
};

//学生类:people
class student:virtual public people
{
public:	//构造:子类构造自己和继承(父类的构造方法)
	student(int i,const char* n,short s):people(i,n),score(s)
	{
	}
	void display()
	{
		cout<<"student::";
		this->show();
		cout<<" score:"<<score<<endl;
	}
protected:
	short score;
};
//老师类:人类
class teacher:virtual public people
{
public:
	teacher(int i,const char* n,int g):people(i,n),grade(g){}
	void display()
	{
		cout<<"teacher::";
		this->show();
		cout<<" grade:"<<grade<<endl;
	}
protected:
	int grade;//年级
};
//博士:学生,老师
class doctor:public student,public teacher
{
public:
	doctor(int i,const char* n,int se,int g,const char* sch):school(sch),student(1001,n,se),teacher(2001,n,g),people(i,n){}
	
protected:
	string school;//学校
};

int main()
{
	doctor zn(1001,"zn",1001,3,"中科大");
	//zn.display();//	二义性(doctor有两个display)
	zn.teacher::display();//输出tacher中的show方法
	zn.student::display();//输出student中的show方法
	//输出ID和姓名
	//zn.people::show();//因为有两份people::show
	zn.teacher::show();
	zn.show();//由于该类中有一份拷贝 

	cout<<endl<<sizeof(zn)<<endl;	
}

二义性 , 虚基类 virtual

  上图中Student 类和Teacher类都继承了people类(共基类) , 所以在继承的时候需要 virtual 来继承(虚基类) , 这样就会为子类申请一个指针空间来指向共基类的地址 , Student类会申请一个指针 , Teacher也会申请一个指针 .  

图中的Student   和   Teacher  都会初始化一次people  ,  为了避免出现这种错误 , 所以需要people  自己来初始化 .

  所以  :  doctor(int i,const char* n,int se,int g,const char* sch):school(sch),student(1001,n,se),teacher(2001,n,g),people(i,n){}

相关标签: 原创