1. 首先,看一个程序 如下
B 继承了 A B 包含两个output 函数
C 继承了 B C 包含三个output 函数
2. 当我们通过下面的程序,想 分别访问 a b c 的 output
函数时,下面的程序是不能真确访问到 output
它只能访问到 c的output 函数
因为 c++ 引入了 覆盖 机制,
例如:当我们访问B时 , 继承类 B output函数 覆盖了 A
的output函数,只会输出B的output
当我们访问C时, 继承类 C output 函数 覆盖 B 的
output 函数,直呼输出 C 的output
下面 的output 函数,都是调用的 C 类的output 函数
下面的程序 也只能 访问到 a 的output 函数
3.如何解决上述不具备多态性的问题??
虚函数机制: 将不同层次完全一样的函数声明为虚函数。
即,前面加上一个 virtual 关键字,这时候,程序执行时就
具备多态性了。
- class A
-
{
-
public:
-
virtual void output();
-
};
-
-
class B:pulic A
-
{
-
public:
-
virtual void output();
-
};
-
-
class C:public B
-
{
-
public:
-
virtual void output();
- };
- vodi function(A &x) 基类A, 可以从基类到 派生类访问
-
{
-
x.output();
-
}
-
-
void main()
-
{
-
A a;
-
B b;
-
C c;
-
-
function(a);
-
function(b);
-
function(c);
- }
3.
当某个函数在不同层次的类中完全相同时,在程序执行时我
们根据不同对象,应该调用哪个层次的函数,我们采用了一种
虚函数的机制:
1. 如果这个函数不加 virtual ,则通过指针或引用来调用
这个函数时,这个函数只具备“一态性”(此刻,所调用的函
数在指针或者引用的类中),而不具备“多态性”。
2. 如果这个函数加了 virtual ,则通过指针或引用来调用
这个函数时,这个函数就具备“多态性”(指向的对象不同,
则调用的函数所在层次不同,由对象所在的类来决定)