一般的认为,虚机制发生在对象调用 时,其实不然,只要能用到之时,他便会出现!在调用基类函数的时候,如果基类调用了一个虚函数,同样虚机制也会产生效果!
看一个程序,没有virtual的情况:
#include
<
iostream
>
using namespace std;
class Base ... {
public:
Base() ...{}
virtual ~Base() ...{}
public:
void print(void) ...{
cout << "Base! ";
}
void get(void ) ...{
print();
}
} ;
class devined : public Base ... {
public:
devined() ...{}
~devined() ...{}
public:
void print(void) ...{
cout << "Devined! ";
}
} ;
int main()
... {
devined *a = new devined;
a->get();
return 0;
}
using namespace std;
class Base ... {
public:
Base() ...{}
virtual ~Base() ...{}
public:
void print(void) ...{
cout << "Base! ";
}
void get(void ) ...{
print();
}
} ;
class devined : public Base ... {
public:
devined() ...{}
~devined() ...{}
public:
void print(void) ...{
cout << "Devined! ";
}
} ;
int main()
... {
devined *a = new devined;
a->get();
return 0;
}
明显输出调用基类的print()函数。结果:Base!
再看虚函数的使用!
#
include <iostream>
using namespace std;
class Base {
public:
Base() {}
virtual ~ Base() {}
public:
virtual void print (void) {
cout << " Base! " ;
}
void get(void ) {
print ();
}
};
class devined : public Base {
public:
devined() {}
~ devined() {}
public:
virtual void print (void) {
cout << " Devined! " ;
}
};
int main()
{
devined * a = new devined;
a -> get();
return 0;
}
using namespace std;
class Base {
public:
Base() {}
virtual ~ Base() {}
public:
virtual void print (void) {
cout << " Base! " ;
}
void get(void ) {
print ();
}
};
class devined : public Base {
public:
devined() {}
~ devined() {}
public:
virtual void print (void) {
cout << " Devined! " ;
}
};
int main()
{
devined * a = new devined;
a -> get();
return 0;
}
即便是调用的基类函数,也还是回到派生类的函数调用!
输出:
Devined!