|
楼主 |
发表于 2020-6-29 10:36:53
|
显示全部楼层
本帖最后由 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++的多态目的。 |
|