公有继承
- 访问权限变化:在公有继承中,
Base
类的公有成员在 Derived
类中仍然是公有成员,Base
类的保护成员在 Derived
类中仍然是保护成员,Base
类的私有成员在 Derived
类中不可访问。
- 多态效果实现:由于
Base
类的虚函数 func
在公有继承下其访问权限不变,仍然是公有,所以可以通过 Base
类指针或引用指向 Derived
类对象,从而实现多态。例如:
Base* ptr = new Derived();
ptr->func(); // 调用 Derived 类的 func 函数,实现多态
私有继承
- 访问权限变化:在私有继承中,
Base
类的公有成员和保护成员在 Derived
类中都变为私有成员,Base
类的私有成员在 Derived
类中仍然不可访问。
- 多态效果实现:虽然
Derived
类对象可以调用 func
函数,但由于 Base
类成员在 Derived
类中变为私有,无法通过 Base
类指针或引用指向 Derived
类对象来实现多态。不过,可以在 Derived
类内部定义一个公有函数,在该函数内部调用 func
函数,间接实现多态效果。例如:
class Derived : private Base {
public:
void callFunc() {
func();
}
};
Derived d;
d.callFunc(); // 间接调用 Derived 类的 func 函数
保护继承
- 访问权限变化:在保护继承中,
Base
类的公有成员和保护成员在 Derived
类中都变为保护成员,Base
类的私有成员在 Derived
类中仍然不可访问。
- 多态效果实现:同私有继承类似,不能直接通过
Base
类指针或引用指向 Derived
类对象来实现多态。但如果从 Derived
类再派生出新的类,在新派生类中可以通过 Base
类指针或引用指向新派生类对象实现多态。例如:
class NewDerived : public Derived {
public:
void newCallFunc() {
Base* ptr = this;
ptr->func(); // 调用 Derived 类的 func 函数,实现多态
}
};
NewDerived nd;
nd.newCallFunc();