默认继承访问说明符

时间:2011-01-25 17:27:19

标签: c++ inheritance

如果我有两个类AB,那么类B会继承A,如下所示:

class B: public A

在这种情况下,我正在进行public继承。

如果我按如下方式编写前面的代码:

class B: A

我将在这里做什么类型的继承(即公开)?换句话说,什么是默认访问说明符?

这里只是一个问题。我是否拨打上一行代码statements?特别是我记得我在 C ++ Without Fear:一本让你感觉聪明的初学者指南的书中读到statements就是;的结尾。你怎么看待这个?

感谢。

9 个答案:

答案 0 :(得分:79)

对所有现有答案的一小部分补充:继承的默认类型取决于继承类型(B),而不是继承的类型(A)。例如:

class A {};
struct B: /* public */ A {};

struct A {};
class B: /* private */ A {};

答案 1 :(得分:19)

对于struct而言它是私有的,对于struct是公共的。

回答:不,这些是根据标准的类的定义

答案 2 :(得分:3)

如果使用class定义类,则默认访问说明符为private。 (我认为这也是错误的。)但是,如果你使用struct,它将是public

我认为类定义是声明。声明是转换为实际代码的内容(除非进行优化,否则) 然而,C和C ++的一个轻微异国情调的特征是表达式是语句。这就是为什么3+4;是C ++中的语法合法语句的原因(尽管许多编译器会警告它没有效果)。虽然在这种情况下显然是无稽之谈,但通常会对表达式的副作用进行评估。 (一个明显的例子是丢弃函数的返回值。你调用函数不是为了获得结果,而是为了它的副作用。)

答案 3 :(得分:2)

当您从另一个类继承一个类时,默认访问说明符是私有的。

#include <stdio.h>

class Base {
public:
int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base       {}

int main()
{
 Derived d;
 d.x = 20; // compiler error becuase inheritance is private
 getchar();
 return 0;
}

从其他类继承结构时,默认访问说明符是公共的。

#include < stdio.h >
  class Base {
    public:
      int x;
  };

struct Derived: Base {}; // is equilalent to struct Derived : public Base {}

int main() {
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}

答案 4 :(得分:1)

如果你没有选择继承,C ++默认为private继承,就像类成员默认为private类访问一样。

答案 5 :(得分:1)

继承的默认类型是C ++中的 private

class B:A
{};

相当于

class B: private A
{};

答案 6 :(得分:1)

继承的“类型”取决于类的定义方式。存在应用于继承的默认访问说明符。来自C ++标准:

[class.access.base]/2

  

在没有基类的访问说明符的情况下,public是   假定使用类键struct定义派生类时   使用class-key定义类时假定为private   class。 [实施例:

class B { /* ... */ };
class D1 : private B { /* ... */ };
class D2 : public B { /* ... */ };
class D3 : B { /* ... */ };             // B private by default
struct D4 : public B { /* ... */ };
struct D5 : private B { /* ... */ };
struct D6 : B { /* ... */ };            // B public by default
class D7 : protected B { /* ... */ };
struct D8 : protected B { /* ... */ };
     

这里B是D2,D4和D6的公共基地,D1,D3的私人基地,   和D5,以及D7和D8的受保护基础。 - 结束例子]

答案 7 :(得分:0)

默认访问说明符是类和结构之间的重要区别。对于类,默认情况下它是公共结构和私有的。

答案 8 :(得分:0)

你有其他铸造问题

class A { virtual void test() = 0; };
class B : virtual public A { virtual void testb() {} };
class C : virtual public A { virtual void testc() {} };
class D : public B, public C {
 virtual void test() override {}
}

void main() {
   D d;
   void* v = &d;
   A* a = &d;

   ((D*)A)->test(); //OK
   ((D*)v)->test(); //undefined behavior (that call testb() in vtable logic at 1st inheritance position)
   dynamic_cast<D*>(v)->test(); //compile error cast from void* not permitted

   //resolution
   void* x = a;
   ((D*)x)->test(); //OK but as you can see, you must to store a* in x*

}