template <typename T>
class BASIC
{
public:
void public_fun();
T public_data_;
protected:
void protected_fun();
T protected_data_;
private:
void private_fun();
T private_data_;
}
公有继承
class CHILD : public BASIC
基类中的公有成员在子类中仍然是公有成员,保护成员在子类中是保护成员,私有成员在子类中不可访问。
class CHILD :public BASIC<int>
{
public:
void fun();
}
CHILD::fun() {
printf("%d\n", public_data_); // 正确
printf("%d\n", protected_data_); // 正确
printf("%d\n", private_data_); // 错误
public_fun(); // 正确
protected_fun(); // 正确
private_fun(); // 错误
}
int main() {
CHILD child;
child.public_data_; // 正确
child.protected_data_; // 错误
chlid.private_data_; //错误
child.public_fun(); // 正确
child.protected_fun(); // 错误
child.private_fun(); // 错误
return 0;
}
私有继承
class CHILD : private BASIC
基类的公有和保护成员在子类中变为私有成员,基类的私有成员在子类中不可访问
class CHILD :private BASIC<int>
{
public:
void fun();
}
CHILD::fun() {
printf("%d\n", public_data_); // 正确
printf("%d\n", protected_data_); // 正确
printf("%d\n", private_data_); // 错误
public_fun(); // 正确
protected_fun(); // 正确
private_fun(); // 错误
}
int main() {
CHILD child;
child.public_data_; // 错误
child.protected_data_; // 错误
chlid.private_data_; //错误
child.public_fun(); // 错误
child.protected_fun(); // 错误
child.private_fun(); // 错误
return 0;
}
保护继承
class CHILD : protected BASIC
基类的公有和保护成员在子类中变为保护成员,私有成员在子类中不可访问
class CHILD :protected BASIC<int>
{
public:
void fun();
}
CHILD::fun() {
printf("%d\n", public_data_); // 正确
printf("%d\n", protected_data_); // 正确
printf("%d\n", private_data_); // 错误
public_fun(); // 正确
protected_fun(); // 正确
private_fun(); // 错误
}
int main() {
CHILD child;
child.public_data_; // 错误
child.protected_data_; // 错误
chlid.private_data_; //错误
child.public_fun(); // 错误
child.protected_fun(); // 错误
child.private_fun(); // 错误
return 0;
}
其实可以看到保护继承和私有继承中子类的权限有些类似,但是私有继承无法将子类对象传给基类对象,也就是无法使用基类指针来指向子类指针。
虚继承
class CHILD : virtual public BASIC
虚公有继承主要用于解决菱形继承问题,在菱形继承的子类中只会保存一份父类的副本,可以解决菱形继承带来的内存浪费和二义性问题(非必要不要使用菱形继承结构)。