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

如题所述

虚基类用于某类从多个类继承,这多个基类有共同基类时,这个最上层基类的成员会多次在最终派生类出现而产生二义性,为避免二义性,使得最终派生类中,最上层的基类成员只有一份,这时需要虚拟继承,该最上层类就是虚基类,需要注意的是,该类在第一层派生时就要虚拟继承才行,使用方法是在继承方式前加上一个 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在试试,你就会明白虚函数的作用。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-15
虚基类可以规范代码的编写,对于可能出现二义性的问题中,虚基类可以消除二义性,是的代码的编写统一规范,也让统筹整个项目的人很好的策划代码实现

虚基类在解决二义性中的问题中的作用是什么
1.为解决多继承产生的二义性问题,可以使用虚基类来消除二义性问题、如:\/\/在最后的派生类中,不仅要负责对直接基类进行初始化,还要负责对虚基类进行初始化 \/\/编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类对虚基类的构造函数的调用,这就保证了虚基类的\/\/数据成员...

C++中,虚基类是如何避免两义性的?
所以虚基类是有性能开销的。基类的成员函数在派生类中不占存储,成员函数只有一个副本。实际上对于普通继承来说,组合和继承是差不多的。所以有人就建议优先使用组合。

关于C++中用虚基类解决二义性问题
那时因为base类里面没有默认构造函数只有一个复制构造函数。你在base的public成员里面加一个构造函数就行了 base(){};

c++中虚继承、虚基类、虚函数、纯虚函数
为了解决继承中的二义性问题,提出了虚基类和虚继承。虚继承主要解决具有公共祖先的多继承带来的二义性问题,对于没有公共祖先的多继承则无法解决。多态性是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。它提供接口与具体实现之间的隔离,将“what”和“how”分离开来,从而提高了代码的可读...

C++中设置虚基类的目的是: A:简化程序 B:消除二义性 C:提高运行效率 D...
A:简化程序 和纯虚函数没关系 B:消除二义性 正解, 虚基类是为了强调"这个类型的某些方法没有意义, 只是为了继承, 不要构造这种类型的对象"C:提高运行效率 和纯虚函数没关系 D:减少目标代码 纯虚函数和空函数相比相差也就是几个字节, 如果这也算的话确实是减少了 ...

17 C++ 菱形继承和虚继承
虚基类的引入,使得间接继承的派生类中仅存在一份基类成员,简化了代码结构,提高了程序的可读性和维护性。此外,虚基类还可以防止多重继承中的二义性问题。总结,菱形继承虽然在某些情况下具有复杂性,但通过虚基类的使用,可以有效解决空间浪费和访问复杂性等问题。在C++中合理使用虚基类,能够提高代码的...

下列关于虚基类的描述,错误的是( )。
【答案】:B B。【解析】虚基类的引入就是为了消除二义性,其构造函数的调用仍然是按照继承的顺序进行的,对于多个虚基类则按它们说明的次序调用,虚基类的构造函数先于非虚基类的构造函数执行。

消除继承中的二义性的两种方法分别是:___ 和 ___。
消除继承中的二义性的两种方法分别是:使用作用域运算符和指明其继承的途径, 使用虚基类

C++ 涉及虚基类的二义性问题 C++ Primer Plus 中的话有点让我觉得前后...
二义性规则主要就是这句吧:如果在某个路径中 X 是虚基类的成员,而在另一路径中 X 是后代派生类的成员,也没有二义性——特定派生类实例的优先级高于共享虚基类实例。很明显,LZ摘得这第二句貌似是不对的,或者是在其他的语境中,或者是作者的笔误 自己敲了个小实验验证一下:include <iostream...

C++中解决二义性问题的方法
c吧 使用虚基类能避免重复继承

相似回答