虚基类在解决二义性中的问题中的作用是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚基类在解决二义性中的问题中的作用是啥相关的知识,希望对你有一定的参考价值。

虚基类用于某类从多个类继承,这多个基类有共同基类时,这个最上层基类的成员会多次在最终派生类出现而产生二义性,为避免二义性,使得最终派生类中,最上层的基类成员只有一份,这时需要虚拟继承,该最上层类就是虚基类,需要注意的是,该类在第一层派生时就要虚拟继承才行,使用方法是在继承方式前加上一个 virtual就可以了。

找个程序给你看一下:

1.为解决多继承产生的二义性问题,可以使用虚基类来消除二义性问题、如:
//在最后的派生类中,不仅要负责对直接基类进行初始化,还要负责对虚基类进行初始化
//编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类对虚基类的构造函数的调用,这就保证了虚基类的//数据成员不会被多次初始化、
#include<iostream>
#include<string>
using namespace std;
class person

protected:
string name;
char sex;
int age;
public:
person(string nam,char s,int a):name(nam),sex(s),age(a)

;
class teacher:virtual public person

protected:
string title;
public:
teacher(string nam,char s,int a,string t):person(nam,s,a),title(t)

;
class student:virtual public person

protected:
float score;
public:
student(string nam,char s,int a,float sco):person(nam,s,a),score(sco)


;
class Graduate:public teacher,public student

private:
float wawg;
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),wawg(w)
void show()

cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;
cout<<"wawgs:"<<wawg<<endl;


;
int main()

Graduate grad1("wang_li",'f',24,"assistent",89.5,1234.5);
grad1.show();
return 0;

2.利用一个指向基类的指针指向派生类的对象,看一下这个例子你就懂了。
#include<iostream>
#include<string>
using namespace std;
class student

private:
int num;
string name;
float score;
public:
student(int,string,float);
void display();
;
student::student(int n,string nam,float s):num(n),name(nam),score(s)

void student::display()

cout<<"student的display(函数)"<<endl;
cout<<endl<<"num : "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"score: "<<score<<endl;

class Graduate:public student

private:
float pay;
public:
Graduate(int,string,float,float);
void display();
;
Graduate::Graduate(int n,string nam,float s,float p):student(n,nam,s),pay(p)


void Graduate::display()

cout<<"Graduate的dispaay(函数)"<<endl;
student::display();
cout<<"pay="<<pay<<endl;

int main()

student stu1(1001,"li",87.5);
Graduate grad1(2001,"wang",98.7,7865.4);
student *pt=&stu1;
pt->display();
cout<<"============================"<<endl;
pt=&grad1;
pt->display();

cout<<"============================"<<endl;
stu1=grad1;
stu1.display();
return 0;

在student 的void display();前面加上virtual在试试,你就会明白虚函数的作用。
参考技术A 虚基类可以规范代码的编写,对于可能出现二义性的问题中,虚基类可以消除二义性,是的代码的编写统一规范,也让统筹整个项目的人很好的策划代码实现

什么叫做虚基类,它有何作用

参考文章:https://zhidao.baidu.com/question/77701815.html
在C++中,如果在多条继承路径上有一个公共的基类,那么在这些路径中的某几条路径的汇合处,这个公共的基类就会产生多个实例.如果想使这个公共的基类只产生一个实例,则可将这个基类说明为虚基类. 这要求在从base类派生新类时,使用关键字virtual将base类说明为虚基类.

用例子说明吧。

class baseprotected:int b;
clase base1:public base…;
clase base2:public base…;

clase derived:public base1,public base2 …;

derived d;
d.b //错误.
d.base::b //错误. 因为不知是用d.base1::b还是d.base2::b

class baseprotected:int b…;
clase base1:virtual public base…; //说明base为虚基类
clase base2:virtual public base…; //说明base为虚基类

clase derived:public base1,public base2 …;

derived d;
d.b //对.
d.base::b //对. 因为d.base::b和d.base1::b还是d.base2::b都是引用同一虚基类成员b,具有相同的值.

以上是关于虚基类在解决二义性中的问题中的作用是啥的主要内容,如果未能解决你的问题,请参考以下文章

c++解决二义性的方法

C++ 类的继承五(多继承的二义性--虚基类)

消除继承中的二义性的两种方法分别是:__________ 和 ______________。

什么叫做虚基类,它有何作用

什么叫做虚基类,它有何作用

解决二义性!