#include<iostream.h>
class A
{
public:
A(const char *s)
{
cout<<s<<endl;
}
~A(){}
};class B:virtual public A {
public:
B(const char *s1,const char *s2):A(s1) //问题一??????????
{
cout<<s2<<endl;
}
};class C:virtual public A
{
public:
C(const char *s1,const char *s2):A(s1)
{
cout<<s2<<endl;
}
};class D:public B,public C //问题二????????????????
{
public:
D(const char *s1,const char *s2,const char *s3,const char *s4):B(s1,s2),C(s1,s3),A(s1)
{
cout<<s4<<endl;
}
};void main()
{
D *ptr=new D("class A","class B","class C","class D");
delete ptr;
}
————————————————————————————————————
问题一:
我知道
class B:public A
{
   ....
};
是说明类B从类A中派生而来,
B(const char *s1,const char *s2):A(s1)
是什么意思?而且构造函数B()和A()参数个数也不同,请问该如何理解?问题二:
class D:public B,public C
怎么理解以上语句,D类从两个类派生出来吗?该如何理解?————————————————————————
谢谢各位大虾帮忙!

解决方案 »

  1.   

    构造函数B()和A()参数个数也不同 在C++ 中是 允许的,B(const char *s1,const char *s2):A(s1) // 此行的 意义也很明显
    此段 代码 演示了在   多继承 存在 菱形的 体系 ,
    一般这样的代码不常见, 也不推荐 这样的多继承, 编译运行, 演示了 构造函数的调用次序。
    多继承一般推荐 多在 接口继承中使用。
      

  2.   

    B(const char *s1,const char *s2):A(s1) 这是B的构造函数吗,后面的:A(s1)是对A的初始化。
      

  3.   

    (1)B(const char *s1,const char *s2):A(s1)
    这是B的构造函数,构造函数后边加冒号可以对基类或自己的数据成员进行初始化。
    该句是用s1的值对类A进行了初始化。
    (2)class D:public B,public C
    是,当然。
    是多重继承,类D是类B和类C的子类。
    现在编程尽量不要使用多重继承,容易造成一些语义模糊的现象。
    一般只用在纯虚函数(接口)中。
      

  4.   

    在2005.net VC下居然没有iostream.h
    晕...