C++多重继承及多态性原理实例详解多重继承及多态性原理实例详解
主要介绍了C++多重继承及多态性原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
价值,需要的朋友可以参考下
一、多重继承的二义性问题一、多重继承的二义性问题
举例:
#include <iostream>
using namespace std;
class BaseA {
public: void fun() { cout << "A.fun" << endl; }
};
class BaseB {
public:
void fun() { cout << "B.fun" << endl; }
void tun() { cout << "B.tun" << endl; }
};
class Derived :public BaseA, public BaseB {
public:
void tun() { cout << "D.tun" << endl; }
void hun() { fun(); } //此处调用出现二义性,编译无法通过
};
int main() {
Derived d, * p = &d; d.hun();
return 0;
}
类名限定
void hun() { BaseA::fun(); } //改写上述代码的第14行,用BaseA类名限定调用的函数
d.BaseB::fun(); //派生类对象调用基类同名函数时,使用类名限定
p->BaseB::fun(); //派生类指针调用基类同名函数时,使用类名限定
名字支配规则
如果存在两个或多个包含关系的作用域,外层声明了一个名字,而内层没有再次声明相同的名字,则外层名字在内层可见;如果在内层声明了相
同的名字,则外层名字在内层不可见——隐藏(屏蔽)规则。
在类的派生层次结构中,基类的成员和派生类新增的成员都具有类作用域,二者的作用域不同:基类在外层,派生类在内层。如果派生类声明了
一个和基类成员同名的新成员,则派生类的新成员就会屏蔽基类的同名成员,直接使用成员名只能访问到派生类新增的成员。(如需使用从基类
继承的成员,应当使用基类名限定)
#include <iostream>
using namespace std;
class Base {
public:
void fun() { cout << "A.fun" << endl; }
Base(int x = 1, int y = 2) :x(x), y(y) {}
int x, y;
};
class Derived :public Base{
public:
void tun() { cout << "D.tun" << endl; }
void fun() { cout << "D.fun" << endl; }
Derived(int x = 0) :x(x) {}
int x;
};
int main() {
Derived d, * p = &d;
d.fun(); //输出的结果为 D.fun
cout << p->x << " " << p->y << " " << p->Base::x << endl; //输出为 0 2 1
d.Base::fun(); //输出为 A.fun
}
二、虚基类二、虚基类
虚基类的使用目的:在继承间接基类时只保留一份成员。
声明虚基类需要在派生类定义时,指定继承方式的时候声明,只需要在访问标号(public、protected、private继承方式)前加上virtual关键字。
注意:为了保证虚基类在派生类中只继承依次,应当在该基类的所有直接派生类中声明为虚基类,否则仍会出现多次继承。
派生类不仅要负责对直接基类进行初始化,还要负责对虚基类初始化;若多重继承中没有虚基类,则派生类只需要对间接基类进行初始化,而对
基类的初始化由各个间接基类完成(会因此产生多个基类的副本保存在各个间接基类中)。
#include <iostream>
using namespace std;
class Base {
public:
Base(int n) { nv = n; cout << "Member of Base" << endl; }
void fun() { cout << "fun of Base" << endl; }
private:
int nv;
};
class A:virtual public Base { //声明Base为虚基类,作为间接基类都需要使用virtual关键字
public: