虚基类在解决二义性中的问题中的作用是啥
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,具有相同的值.
以上是关于虚基类在解决二义性中的问题中的作用是啥的主要内容,如果未能解决你的问题,请参考以下文章