如果我有两个类A
和B
,那么类B
会继承A
,如下所示:
class B: public A
在这种情况下,我正在进行public
继承。
如果我按如下方式编写前面的代码:
class B: A
我将在这里做什么类型的继承(即公开)?换句话说,什么是默认访问说明符?
这里只是一个问题。我是否拨打上一行代码statements
?特别是我记得我在 C ++ Without Fear:一本让你感觉聪明的初学者指南的书中读到statements
就是;
的结尾。你怎么看待这个?
感谢。
答案 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 ++标准:
在没有基类的访问说明符的情况下,public是 假定使用类键
struct
定义派生类时 使用class-key定义类时假定为privateclass
。 [实施例: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*
}