条件一:B继承A,C继承B
class A
{
public:
void pp() { cout << "A" << endl; }
};
class B : public A
{
public:
void pp() { cout << "B" << endl; }
};
class C : public B
{
public:
void pp() { cout << "C" << endl; }
};
条件二:存在两个重载函数:
void pp(B*b)
void pp(A*a)
问题:pp(new C)进哪个重载函数
Coding:
class A
{
public:
void pp() { cout << "A" << endl; }
};
class B : public A
{
public:
void pp() { cout << "B" << endl; }
};
class C : public B
{
public:
void pp() { cout << "C" << endl; }
};
class D : public A
{
public:
void pp() { cout << "D" << endl; }
};
void pp(B*b)
{
b->pp();
cout << "BPP" << endl;
}
void pp(A* a)
{
a->pp();
cout << "APP" << endl;
}
int main()
{
pp(new C);
return 0;
}
输出结果:
C
BPP
单线多继承下:
class D : public B ,public A
{
public:
virtual void pp() { cout << "D" << endl; }
};
int main()
{
pp(new D);
return 0;
}
输出:
D
BPP
多继承下:
class A
{
public:
virtual void pp() { cout << "A" << endl; }
};
class AA
{
public:
virtual void pp() { cout << "AA" << endl; }
};
class D : public A ,public AA
{
public:
virtual void pp() { cout << "D" << endl; }
};
void pp(A* a)
{
a->pp();
cout << "APP" << endl;
}
void pp(AA* a)
{
a->pp();
cout << "APP" << endl;
}
int main()
{
pp(new D);
return 0;
}
结果:
编译报错:pp对重载函数的调用不明确
结论:
重载派生,就近原则。无法确定时,会编译报错