看看C++代码和运行结果,求大神帮忙解释子类和基类的关系
看看C++代码和运行结果,里面有虚函数,但还没有虚继承,求大神帮忙解释子类和基类的关系!感觉对C++中的对象模型的实现,虚函数的底层实现,this指针,类间的强制转化等一...
看看C++代码和运行结果,里面有虚函数,但还没有虚继承,求大神帮忙解释子类和基类的关系!
感觉对C++中的对象模型的实现,虚函数的底层实现,this指针,类间的强制转化等一下子都搞糊了,望高手能够多多指导,悬赏能加就加,拜托!
代码如下:
#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'; }
void fun() { cout<<"B::fun and m_a="<<m_a<<endl; }
void b_fun() { cout<<"B::b_fun"<<endl; }
private:
char m_b;};
class D : public C{public:
D() { m_c='D'; }
void fun() { cout<<"D::fun and m_c="<<m_c<<endl; } void d_fun() { cout<<"D::d_fun"<<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;}
运行结果如下:
有关vfptr(虚函数表指针),vftable(虚函数表)的相关内容已经略知一 二,但我的疑问在于,如何调用类的成员函数以及怎么利用虚函数表指针的底层机理,如何确定this指针? 展开
感觉对C++中的对象模型的实现,虚函数的底层实现,this指针,类间的强制转化等一下子都搞糊了,望高手能够多多指导,悬赏能加就加,拜托!
代码如下:
#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'; }
void fun() { cout<<"B::fun and m_a="<<m_a<<endl; }
void b_fun() { cout<<"B::b_fun"<<endl; }
private:
char m_b;};
class D : public C{public:
D() { m_c='D'; }
void fun() { cout<<"D::fun and m_c="<<m_c<<endl; } void d_fun() { cout<<"D::d_fun"<<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;}
运行结果如下:
有关vfptr(虚函数表指针),vftable(虚函数表)的相关内容已经略知一 二,但我的疑问在于,如何调用类的成员函数以及怎么利用虚函数表指针的底层机理,如何确定this指针? 展开
1个回答
展开全部
底层机理那是编译器的内部实现,微软不打算向外公开太多细节,编译器更新换代快,每一次升级,底层实现细节都会发生翻天覆地的变化,所以你不需要掌握内部实现细节;
类成员函数直接就可以调用,虚函数表很复杂,你把不懂的地方描述一下,我帮你解惑;
类成员函数直接就可以调用,虚函数表很复杂,你把不懂的地方描述一下,我帮你解惑;
更多追问追答
追问
我不是想了解编译器内部的实现,但我感觉无法理解运行的结果,能不能麻烦解释一下!特别是强制转化类有什么规则?用类的指针调用函数有什么规律?
追答
这个你可以参考一下 MSDN,我给你大概说一下;
强制转换是代码层面的东西,对于内建数据类型,编译器会直接按内存进行拷贝,对于用户自定义数据类型,比方说类和结构体等等,编译器会智能转换,但是这个转换不一定符合程序员的需求;
因此出现了 static_cast、const_cast、dynamic_cast 等类型转换符,这些符号明确地告诉编译器需要如何去转换一个数据类型到另外一种数据类型,static_cast 是从内存上依样拷贝数据,const_cast 用于移除 const 变量的 const 属性,dynamic_cast 告诉编译器将一个用户自定义类型智能地转换到另一个用户自定义数据类型;
类指针调用函数主要用于实现多态,如果类 A 拥有虚函数 func,类 B 也拥有虚函数 func,并且类 B 继承自类 A,则当一个 A 指针指向 A 对象时,调用的是 A 的 func 函数,而一个 A 指针指向 B 对象时,调用的是 B 的 func 函数;
虚函数表记录了某个类的虚函数地址,如果类 B 继承自类 A,则类 B 的虚函数表也包含类 A 的虚函数表,把类 B 的地址赋值给类 A 指针之后,类 A 指针指向的是类 B 的虚函数表,因此类 A 此时可以调用类 B 的虚函数;
这些东西太复杂,一言难尽,我建议你看看 C++ Primer,讲解得很详尽;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询