继承分为三种:
- 上市
- 受保护
- 私人的
class 的 dafult 模式是私有的,而 struct 是公共的:
在基类没有访问说明符的情况下,当派生类使用 class-key struct 定义时假定为 public,而当使用 class-key class定义类时假定为 private。
[From C++ standard, 11.2.2]
所以,当你说:
class B: A
这是私有继承,因此基类的所有公共和受保护成员都将作为私有继承。你需要的是
class B: public A
或者
class B: protected A
私有和受保护的继承更常用于定义实现细节。在通过将接口限制为基类来定义类时,私有基类最有用,这样可以提供更强的保证。例如,Vec
将范围检查添加到其私有基vector
(§3.7.1)和list
指针模板将类型检查添加到其list<void*>
基 -> 参见 Stroustrup(“C++ ...”§13.5)。
例子:
//Class A
class A
{
public:
int getX(){return _x;};
protected:
int getX2(){return _x;}
private:
int _x;
};
//Class B
class B : protected A //A::getX and A::getX2 are not visible in B interface,
^^^^^^^^^ // but still we can use it inside B class: inherited
// members are always there, the inheritance mode
// affects only how they are accessible outside the class
// in particular for a children
{
public:
int method(){ return this->getX();}
int method2(){ return this->getX2();}
};
int main(int argc, char** argv) {
B b=B();
printf("b.getX(): %d",b.method()); // OK
printf("b.getX(): %d",b.method2()); // OK
return 0;
}
对继承的进一步影响
此外,当您将类声明为
class B: A
与class B: private A
进一步继承相同变得不可用:只有派生自A
及其朋友的类才能使用A
公共成员和受保护成员。只有朋友和成员B
可以转换B*
为A*
.
如果A
是一个受保护的基类,那么它的公共成员和受保护成员可以被类B
及其朋友以及派生自B
其朋友的类使用。只有friends and members ofB
和friends and members of class derived fromB
可以转换B*
为A*
.
如果最终A
是一个公共基础,那么它的公共成员可以被任何类使用,它的受保护成员可以被派生类及其朋友以及派生类B
及其朋友使用。任何函数都可以转换B*
为A*
.
另请注意,您不能使用or强制转换常量,据说它们都尊重常量。它们也都尊重访问控制(不可能强制转换为私有基[因为只有派生类方法可能会这样做,并且类的方法是这个 {friend 声明在 Base} 中的朋友])dynamic_cast
static_cast
Derived* -> Base*
更多在 Stroustrup ("C++", 15.3.2)