静态方法和虚方法。。迷糊
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
using namespace std;
class A
{
public:
void virtual print()
{
cout << "A" << endl;
}
};
class B:public A
{
public:
void virtual print()
{
cout << "B" << endl;
}
};
class C:public B
{
public:
static void print()
{
cout << "C" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A * ac;
C c;
ac = &c;
ac->print();
cin.get();
return 0;
}
这个程序的输出是B
为什么是B哩?
静态方法不会进行VTABLE,所以没有多态性,那么不是应该调用A类的PRINT输出A么?为什么会输出B
[解决办法]
因为你虽然指针是A的,可是你指向的对象是C的,通过A的print函数调用时,它要Vtable(虚函数数)找具体对象对应的那个虚函数。这就是虚函数多态机制干的事情。你可以认为C的Print就不存在,那么找到里C继承关系最近的print 就是B的了。
如果想非调用A的不可的话:可以这么干:
ac->A::print();
C的方法不用对象也能调用:
C::print();
也可以
c.print();
[解决办法]
ac是A的指针,执行ac- >print()的时候,就执行A的print(),但A中的print()是虚函数,是把C转型为A,则去找C的虚函数表,而C中print()的为static,则C中print()函数的地址不被写入虚函数表,写入的是B中print()函数的地址.那么A得到的虚函数表是中的print()是B的print().