用来理解多继承(无虚拟继承)行为的示例程序
用来理解多继承(无虚拟继承)行为的示例程序,测试了几个点:
1.类实例内存的存放顺序。
2.有虚函数对类占空间的影响。
3.用基类指针指向派生类时,this的类型转换。
4.在向派生类未改写的函数传this指针时,类型的转换。
1.类实例内存的存放顺序。
2.有虚函数对类占空间的影响。
3.用基类指针指向派生类时,this的类型转换。
4.在向派生类未改写的函数传this指针时,类型的转换。
#include<iostream>
#define OUTPUT " typename["<<typeid(*this).name()<<"] sizeof["<<sizeof(*this)<<"] address["<<this<<"]"<<endl
using namespace std;
class B1
{
public:
void b1f(){cout<<"B1::b1f()"<<OUTPUT;}//派生类中改写
void b1g(){cout<<"B1::b1g()"<<OUTPUT;}//派生类中未改写
private:
int b1;
};
class B2
{
public:
virtual void b2vf(){cout<<"B2::b2vf()"<<OUTPUT;}//派生类中改写
virtual void b2vg(){cout<<"B2::b2vg()"<<OUTPUT;}//派生类中未改写
private:
int b2;
};
class D:public B1,public B2
{
public:
void b1f(){cout<<"D::b1f()"<<OUTPUT;}
virtual void b2vf(){cout<<"D::b2vf()"<<OUTPUT;}
private:
int d;
};
int main()
{
D d,*pd=&d;
B1 *pb1=&d;
B2 *pb2=&d;
cout<<endl<<"指针调用"<<endl;
cout<<"pb1->b1f() ==> ";pb1->b1f();cout<<endl;
cout<<"pb1->b1g() ==> ";pb1->b1g();cout<<endl;
cout<<"pb2->b2vf() ==> ";pb2->b2vf();cout<<endl;
cout<<"pb2->b2vg() ==> ";pb2->b2vg();cout<<endl;
cout<<endl<<"对象调用"<<endl;
cout<<"d.b1f() ==> ";d.b1f();cout<<endl;
cout<<"d.b1g() ==> ";d.b1g();cout<<endl;
cout<<"d.b2vf() ==> ";d.b2vf();cout<<endl;
cout<<"d.b2vg() ==> ";d.b2vg();cout<<endl;
return 0;
}
...全文
相关推荐
C++多继承Demo
而`helloworld.exe`是编译后的可执行程序,可以直接运行查看多继承的输出效果。通过分析源代码,我们可以更深入地理解多继承的实现细节和应用场景。
C++继承深度解析[项目源码]
C++作为面向对象的编程语言,继承机制是其核心特性之一。继承允许程序员定义一个类(派生类)来继承另一个类(基类)的属性和行为,从而实现代码复用,提高开发效率。
java九大示例程序
这些示例涵盖了Java面向对象编程的关键概念,包括封装、继承、多态等。理解并熟练运用这些知识,对于编写高效、灵活的Java代码至关重要。
多态概念与实现[项目源码]
文章通过单继承和多继承的虚函数调用示例,进一步阐明了多态的实现机制。在单继承情况下,派生类重写基类的虚函数,通过基类指针或引用可以调用派生类的实现。
C++多态详解[可运行源码]
这通常通过虚拟继承和虚表指针的多重间接寻址来实现。为了帮助读者更好地理解多态的实现原理,文章通过代码示例详细展示了在单继承和多继承的情况下的虚函数表结构。


