c++虚基类二义性的问题

问题描述

c++虚基类二义性的问题
#include
using namespace std;
class A{
public:
A(int a):x(a){ cout<<""A constructor...""<<x<<endl; }
int f(){return ++x;}
~A(){cout<<""destructor A...""<<endl;}
private:
int x;
};
class B:public virtual A{
private:
int y;
A Aobj;
public:
B(int aint bint c):A(a)y(c)Aobj(c){ cout<<""B constructor...""<<y<<endl;}
int f(){
A::f();
Aobj.f();
return ++y;
}
void display(){ cout<<A::f()<<""t""<<Aobj.f()<<""t""<<f()<<endl; }
~B(){cout<<""destructor B...""<<endl;}

};
class C:public B{
public:
C(int aint bint c):B(abc)A(0){ cout<<""C constructor...""<<endl;}
};
class D:public Cpublic virtual A{
public:
D(int aint bint c):C(abc)A(c){ cout<<""D constructor...""<<endl;}
~D(){cout<<""destructor D....""<<endl;}
};
int main()
{
D d(789);
d.f();
d.display();
return 0;
}

main 中d.f(); 语句调用时 D类中有公有继承B类中的f();方法 和公有虚继承A 中的f();为什么不会产生二义性; 谢谢

时间: 2024-10-26 23:34:56

c++虚基类二义性的问题的相关文章

c++-C++自己写的虚基类和同名函数多重继承的小例子出现了继承不明确的问题

问题描述 C++自己写的虚基类和同名函数多重继承的小例子出现了继承不明确的问题 #include using namespace std; class vihicle { public: int i; virtual void run() { cout<<"111"; } }; class bicycle:virtual public vihicle { public: void run() { cout<<"bicycle run"; }

虚函数、抽象类及虚基类

虚函数.抽象类及虚基类 虚函数及抽象类: 派生类经常(但不总是)覆盖它继承的虚函数.如果没有覆盖,派生类会直接继承其在基类中的版本. 派生类可以在它覆盖的函数前使用virtual关键字,但不是非得这么做. C++11允许派生类使用override关键字,显式地注明它重写了基类中的某个虚函数. 常见的不能声明为虚函数的有:非成员函数(含友元函数):静态成员函数:构造函数. 1.为什么C++不支持普通函数和友元函数为虚函数? 它们不能被继承. 2.为什么C++不支持构造函数为虚函数? 构造函数不能被

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

详谈C++中虚基类在派生类中的内存布局_C 语言

今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示: 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同. 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1).obj 是一个虚拟继承的派生类的对象 (2).mem是从虚拟基类派

派生-运用虚基类对公司员工管理系统 的实现

问题描述 运用虚基类对公司员工管理系统 的实现 设计一个利用文件处理方式实现对公司人员(包括工程师.领导和主任工程师)进行管理,要求具有增加数据.更新数据.查询数据.删除数据以及实现数据的功能. 实现提示: 设计一个虚基类Staff(员工),包含编号.姓名和年龄保护数据成员以及相关的成员函数:由Staff派生出工程师类Engineer,包含专业和职称保护数据成员以及相关的成员函数:再由Staff派生出领导类Leader,包含职务和部门保护数据成员以及相关的成员函数:然后由Engineer和Lea

关于多重继承和虚基类的问题

问题描述 关于多重继承和虚基类的问题 以下是源代码.为什么输出的sphere的球心是(003)而不是(123)? #include <iostream>using namespace std;class Point2D{protected: double x; double y;public: Point2D() { x = 0; y = 0; } Point2D(double a double b) { x = a; y = b; } virtual void show() { cout &

求教前辈 c++ ,关于纯虚基类

问题描述 求教前辈 c++ ,关于纯虚基类 using std::cout; using std::cin; using std::endl; class A { public: virtual void show()const= 0; virtual void show()= 0; }; class B :public A { public: virtual void show() { cout << "存在 const" << endl;} virtual

实例讲解C++编程中的虚函数与虚基类_C 语言

虚函数① #include "stdafx.h" #include <iostream> using namespace std; class B0//基类B0声明 { public: void display(){cout<<"B0::display()"<<endl;}//公有成员函数 }; class B1: public B0//公有派生类B1声明 { public: void display(){cout<<

c++-C++中虚基类中关于内存计算的问题

问题描述 C++中虚基类中关于内存计算的问题 情况一: class D{ public: int a; }; class A:virtual public D{ }; class B :virtual public D{ }; class C:public A,public B{ public: int a1; }; 用sizeof(C)计算出等于16: 情况二: class D{ public: int a; }; class A:public D{ }; class B :public D{