本文讨论的前提是在C++标准下的类和结构体,而不是讨论C中的结构体.
在C++中,类和结构体的唯一区别是成员的可见性(两者都支持数据和成员函数以及构造函数和析构函数).
对于类来说,成员默认为私有.
对于结构体来说,成员默认为公有.
对于继承来说,类之间的继承,成员默认为私有,而结构体之间的继承则默认为公有.

如果是类和结构体之间的继承,情况会怎样呢?

class A
{
public:
int a;
};

struct B : A { };

struct C
{
int c;
};

class D : C
{
};

int main()
{
B b;
D d;
b.a = 1;
d.c = 2;
}

用 C++编译器编译上面的代码,会在 d.c = 2;处报错,VC 6.0给出的错误提示:error C2248: ‘c’ : cannot access public member declared in class ‘C’,看起来有点匪夷所思啊,不能访问公有成员(既然都公有了,还不能访问?).
相应的C++标准 11.2.2 of ISO/IEC 14882-2003文档:
the kind of inheritance is determined by the derived class being declared as a class or struct when an access specificer for the base class is absent.
当被继承的基类缺少存取说明符的修饰时, 继承的类型由被声明为类或者结构体的派生类所决定.
示例中class D : C, 基类C并没有存取说明符的修饰,那么集成的类型就由派生类D来决定,D被声明为类(而非结构体),对于类来说,类之间的继承,成员默认为私有,所以实际上此时的int c;应该为私有,那么上面的编译错误也就可以解释通了.
我们可以试着把class D : C 改为 class D : public C,就可以编译通过了.

Posted on 2010-06-09 12:21 郑兴锋 阅读(822) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理