首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

静态方法和虚方法。迷糊解决方案

2012-02-26 
静态方法和虚方法。。迷糊// test.cpp : 定义控制台应用程序的入口点。//#include stdafx.husing namespace

静态方法和虚方法。。迷糊
// 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().

热点排行