C++类继承关系问题
在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了什么含义呢?
1. public
从语义角度上来说,public继承是一种接口继承,根据面向对象中的关系而言就是,子类可以代替父类完成父类接口所声明的行为,也就是必须符合“Liskov替换原则(LSP)”,
此时子类可以自动转换成为父类的接口,完成接口转换。
从语法角度上来说,public继承会保留父类中成员(包括函数和变量等)的可见性不变,
也就是说,如果父类中的某个函数是public的,那么在被子类继承后仍然是public的。
2. protected
从语义角度上来说,protected继承是一种实现继承,根据面向对象中的关系而言就是,子类不能代替父类完成父类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”,
此时子类不能自动转换成为父类的接口,就算通过类型转换(static_cast和dynamic_cast)
也会得到一个空指针。
从语法角度上来说,protected继承会将父类中的public可见性的成员修改成为protected
可见性,相当于在子类中引入了protected成员,这样一来在子类中同样还是可以调用父
类的protected和public成员,子类的子类就也可以调用被protected继承的父类的protected
和public成员。
例如:
class CSample1 {
protected:
void printProtected() {}
public:
void printPublic() {}
};
class CSample2 : protected CSample1 {
};
class CSample3 : public CSample2 {
void print3() {
printProtected();
printPublic();
}
};3. private
从语义角度上来说,private继承是一种实现继承,根据面向对象中的关系而言就是,子类不能代替父类完成父类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”,
此时子类不能自动转换成为父类的接口,就算通过类型转换(static_cast和dynamic_cast)
也会得到一个空指针。
从语法角度上来说,private继承会将父类中的public和protected可见性的成员修改成为
private可见性,这样一来虽然子类中同样还是可以调用父类的protected和public成员,
但是在子类的子类就不可以再调用被private继承的父类的成员了。
class CSample1 {
protected:
void printProtected() {}
public:
void printPublic() {}
};
class CSample2 : private CSample1 {
};
class CSample3 : public CSample2 {
void print3() {
printProtected(); // 编译错误,不可以调用该函数
printPublic(); // 编译错误,不可以调用该函数
}
};在面向对象的理论中有两种概念:接口、实现,所以就出现了所谓的接口继承和实现继
承两种关系。而protected和private就是实现继承中所要用到的,其实protected和private
两者则约束继承时并没有形成两种不同的继承类别,而仅仅只是为了方便C++类方法的传递
调用而设计的,其实在java这样面向对象要求更为严格的语言当中,没有实现继承,他必须
通过委托方式来完成这一概念,如果熟悉java就会明白,如果一个对象要使用另外一个对象
的接口功能,而自身又不能够充当该对象所扮演的角色时,就会通过委托来完成,这样一来
就必须在对象中包含一个委托对象,通过对象调用语法来完成功能;在C++中就可以通过
protected和private继承来完成java中的委托关系(当然C++也可以形成对象委托关系),
那么这种情况下protected继承就容许委托可以传递(也就是被多级子类调用),而private
继承是不容许委托被传递的。
基类无法限制子类的继承关系而进行的一种拓展。在Java中,final可以控制该类不能被继承,C++没有这种方式,但是private继承却可以限制继承类的继承类的访问控制。
一般来说尽量用复合而不用private这种实现方式 但是。。。。
用 private实现继承 和 复合(composite)可能原因之一就是:derived class
需要访问base class protected 的成员
class B
{
public:
//...
protectd:
int i;
//...
};
class A
{
B b; //无法访问b中i
}class A: private B
{
//... 这就可以了,using B::i;
};
本文详细解释了C++中public、protected和private三种继承的关系及其语法特性,对比了它们在面向对象编程中的不同应用场景,并讨论了如何利用这些特性实现特定的设计需求。
1429

被折叠的 条评论
为什么被折叠?



