C++多重继承中的虚继承和虚函数举例

上一篇虚继承举例:http://10638473.blog.51cto.com/10628473/1964414

本文将A类中的show()函数前加上virtual关键字。

//多重继承
#include <iostream>
using namespace std;

class A
{
public:
    int a;
    A(int a=0):a(a)
    {
        cout<<"A基类A::A()"<<endl;
    }
    ~A()
    {
        cout<<"A基类A::~A()"<<endl;
    }
    virtual void show()
    {
        cout<<"A基类A::a="<<a<<endl;
    }
};

class B:virtual public A
{
protected:
    int b;
public:
    B(int a=0,int b=0):A(a),b(b)
    {
        cout<<"B子类B:B()"<<endl;
    }
    ~B()
    {
        cout<<"B子类B:~B()"<<endl;
    }
    void show()
    {
        cout<<"B子类B::b="<<b<<endl;
    }
};

class C:virtual public A
{
protected:
    int c;
public:
    C(int a=0,int c=0):A(a),c(c)
    {
        cout<<"C子类C::C()"<<endl;
    }
    ~C()
    {
        cout<<"C子类C::~C()"<<endl;
    }
    void show()
    {
        cout<<"C子类C::c="<<c<<endl;
    }
};

class D:public B,public C
{
protected:
    int d;
public:
    D(int a=0,int b=0,int c=0,int d=0):d(d),B(a,b),C(a,c)
    {
        cout<<"D孙子类D::D()"<<endl;
    }
    ~D()
    {
        cout<<"D孙子类D::~D()"<<endl;
    }
    void show()
    {
        cout<<"D孙子类D::c="<<d<<endl;
    }
};
void Display(A *p)
{
    p->show();
}
int main(int argc, char *argv[])
{
    A a(1);
    B b(2,3);
    C c(4,5);
    D d(6,7,8,9);
    
    A *p;
    p=&a;
    p->show();
    
    p=&b;
    p->show();
    
    p=&c;
    p->show();
    
    B *q;
    q=&d;
    q->show();
    
    return 0;
}

可以和上一篇对比一下结果。

时间: 2024-10-09 21:12:54

C++多重继承中的虚继承和虚函数举例的相关文章

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承、虚继承与虚基类

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承.虚继承与虚基类 一.多重继承 在C++语言中,一个派生类可以从一个基类派生,称为单继承:也可以从多个基类派生,称为多继承. 多重继承--一个派生类可以有多个基类 class <派生类名> : <继承方式1> <基类名1>,<继承方式2> <基类名2>,... { <派生类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个

C++ 虚继承和虚函数同时存在的对象模型

如果说没有虚函数的虚继承只是一个噩梦的话,那么这里就是真正的炼狱.这个C++中最复杂的继承层次在VC上的实现其实我没有完全理解,摸爬滚打了一番也算得出了微软的实现方法吧,至于一些刁钻的实现方式我也想不到什么理由来解释它,也只算是知其然不知其所以然吧. 分2个阶段来探讨: 1.      有虚函数的派生类虚继承了没有虚函数的基类: 2.      有虚函数的派生类虚继承了有虚函数的基类: 1.  基类无虚函数 1.1 虚.实基类都没有虚函数 这种情况也还算比较简单.因为虚函数表指针一定是会放在最开

虚继承和虚函数继承

虚继承主要用于菱形 形式的继承形式 虚继承是为了在多继承的时候避免引发歧义, 比如类A有个就是a,B继承了A,C也继承了A,当D多继承B,C时,就会有歧义产生了,所以要使用虚拟继承避免重复拷贝. 虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联 虚函数继承: class A { virtual void fun() {cout < <'A' < <endl;}; }; class B : pub

虚继承与虚函数继承

虚继承主要用于菱形 形式的继承形式. 虚继承是为了在多继承的时候避免引发歧义,比如类A有个就是a,B继承了A,C也继承了A,当D多继承B,C时,就会有歧义产生了,所以要使用虚拟继承避免重复拷贝.虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联 虚函数继承:class A{    virtual void fun() {cout < <'A' < <endl;};};class B : publi

C++虚继承和虚基类

看如下代码: 1 #include <iostream> 2 3 using namespace std; 4 5 class A { 6 public: 7 A() {}; 8 9 protected: 10 int m_a; 11 }; 12 13 class B : public A 14 { 15 public: 16 B(){}; 17 18 protected: 19 int m_b; 20 }; 21 22 class C : public A 23 { 24 public: 2

记录:C++类内存分布(虚继承与虚函数)

工具:VS2013 先说一下VS环境下查看类内存分布的方法: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局. 编译后,输出如图的内存布局: 测试代码 #include <iostream> using namespace std; typedef void(*FUN)(); cl

Python中的多个内置函数举例

Python内置函数: 官方帮助文档: https://docs.python.org/2.7/ 返回数字的绝对值. def fun(x): if x < 0: return -x return x print fun(10) 常用函数: abs() >>> abs(-100) 100 取列表最大值和最小值 max() >>> max('1235',123) '1235' min() >>> min('asdfq3w45') '3' len()

多重继承及虚继承中对象内存的分布

http://www.uml.org.cn/c++/201305163.asp 个人总结:多重继承时,对象中保存多个虚函数表指针, 虚拟继承时,对象中保存多个虚函数表指针,但被虚拟继承的基类对象在被继承的对象中只有一份,这个是靠共享其内容实现的.且共享的内容在子类对象的最后. 虚拟继承 为了避免上述Top类的多次继承,我们必须虚拟继承类Top. 1 class Top2 {3 public:4 int a;5 };67 class Left : virtual public Top8 {9 pu

[转载]多重继承及虚继承中对象内存的分布

粘过来的效果还不错:) 本位通过不断地完善讲解多重继承及虚继承中对象内存的分布. 读的时候不要着急,第一遍会有些晕,第二遍就会好很多. 能帮助加深对多重继承及虚继承对象内存的分布情况. 多重继承及虚继承中对象内存的分布     这篇文章主要讲解G++编译器中虚继承的对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别.虚函数表的格式等一些大部分C++程序员都似是而非的概念. 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识.