本帖最后由 jhanker 于 2020-6-29 10:51 编辑
我觉得这代码主要是为了了解在类继承过程中要注意指针的使用,如果使用不当会出现内存泄露,编写代码的老师估计是个高手,是为了让学生理解c++的底层机理吧,我把代码改了一点,你们可以运行看看!#include <iostream>
using namespace std;
class A//有虚函数的基类A
{
public:
A() { m_a='A'; }
virtual void fun() { cout<<"A::fun() and m_a="<<m_a<<endl; }
protected:
char m_a;
};
class C//无虚函数的基类C
{public:
C() { m_c='C'; }
void fun() { cout<<"C::fun() and m_c="<<m_c<<endl; }
protected:
char m_c;
};
class B : public A
{
public:
B() { m_a='B'; m_b='B';}
void fun() { cout<<"B::fun() and m_a="<<m_a<<endl; }
void b_fun() { cout<<"B::b_fun() and m_a="<<m_a<<" and m_b="<<m_b<<endl; }
private:
char m_b;
};
class D : public C
{
public:
D() { m_c='D'; m_d='D';}
void fun() { cout<<"D::fun() and m_c="<<m_c<<endl; }
void d_fun() { cout<<"D::d_fun() and m_c="<<m_c<<" and m_d="<<m_d<<endl; }
private:
char m_d;
};
int main()
{
A * a = new A;
B * pb;
pb = static_cast<B *>(a);
pb->fun();
pb->b_fun();
C * c = new C;
D * pd;
pd = static_cast<D *>(c);
pd->fun();
pd->d_fun();
A * pa = new B; pa->fun(); //pa->b_fun();
C * pc = new D; pc->fun(); //pc->d_fun();
return 0;
}
例如当运行pb->b_fun();的时候其实已经出现内存泄露了,m_b的值根本就不存在,但B::b_fun()函数照样被调用了
其实老教授是想让他的学生明白虚函数表。
虚成员函数的处理方法,在VC++ 中,与虚继承的处理方式如出一辙,这样同样也造成对象实例占用了更多内存空间,因为实例需增加一个隐藏的“虚函数表指针”(virtual function pointer 或 virtual function table pointer)成员变量,简称vfptr,从而达C++的多态目的。 |