版权声明:版权所有 如有侵权 概不追究 https://blog.csdn.net/weixin_40903417/article/details/87807653
当派生类与积累中有相同成员时:
同名隐藏规则:若未特别限定,则通过派生类对象使用的是派生类中的同名成员;
如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名和作用域操作符(::)来限定。
#include "stdafx.h"
using namespace std;
class Base1
{
public:
int var;
void print()
{
cout<<this->var<<endl;
}
};
class Base2
{
public:
int var;
void print()
{
cout<<this->var<<endl;
}
};
class Derived:public Base1,public Base2
{
public:
int var;
void print()
{
cout<<this->var<<endl;
}
};
int main()
{
Derived a;
Derived *pt=&a;
a.var=3;
pt->print();
a.Base1::var=1;
pt->Base1::print();
a.Base2::var=2;
pt->Base2::print();
system("Pause");
return 0;
}
需要解决的问题
当派生类从多个基类派生,而这些基类又有共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性。
虚基类声明
以virtual说明基类继承方式:class B1:virtual public B
作用
主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题;为最远的派生类提供唯一的基类成员,而不重复产生多次复制
注意
在第一级继承时就要将共同基类设计为虚基类
#include "stdafx.h"
using namespace std;
class Base0
{
public:
int var0;
void print()
{
cout<<this->var0<<endl;
}
};
class Base1:virtual public Base0
{
public:
int var1;
void print()
{
cout<<this->var1<<endl;
}
};
class Base2:virtual public Base0
{
public:
int var2;
void print()
{
cout<<this->var2<<endl;
}
};
class Derived:public Base1,public Base2
{
public:
int var;
void print()
{
cout<<this->var<<endl;
}
};
int main()
{
Derived a;
a.var0=2;
a.Base0::print();
system("Pause");
return 0;
}
在建立对象时,所有派生类都要调用直接基类的构造函数,而只有最远派生类的构造函数调用虚基类的构造函数,其他类对虚基类构造函数的调用被忽略。
#include "stdafx.h"
using namespace std;
class Base0
{
public:
int var0;
Base0(int v):var0(v){}
void print()
{
cout<<this->var0<<endl;
}
};
class Base1:virtual public Base0
{
public:
int var1;
Base1(int v):Base0(v),var1(v){}
void print()
{
cout<<this->var1<<endl;
}
};
class Base2:virtual public Base0
{
public:
int var2;
Base2(int v):Base0(v),var2(v){}
void print()
{
cout<<this->var2<<endl;
}
};
class Derived:public Base1,public Base2
{
public:
int var;
Derived(int v,int v1,int v2):Base0(v),Base1(v1),Base2(v2),var(v){}
void print()
{
cout<<this->var<<endl;
}
};
int main()
{
Derived a(1,2,3);
a.Base2::print();
system("Pause");
return 0;
}