📅  最后修改于: 2023-12-03 15:29:53.318000             🧑  作者: Mango
在C++中,多态是一种特性,它允许使用基类指针来调用派生类中的函数。这是通过使用虚函数和继承实现的。C++中有三种继承类型,包括public、protected和private继承,这些继承类型中都可以使用运行时多态。
虚函数是一个在基类中声明,可以在派生类中重新定义的函数。它通过使用动态链接来实现,这意味着基类指针指向派生类对象时,调用的是派生类中的函数。下面是一个简单的虚函数示例:
class Base{
public:
virtual void func(){
cout << "Base" << endl;
}
};
class Derived: public Base{
public:
void func(){
cout << "Derived" << endl;
}
};
int main(){
Base *ptr = new Derived();
ptr->func(); //输出Derived
return 0;
}
在这个示例中,Base类定义了一个虚函数func(),Derived类覆盖了这个函数并实现了自己的版本。通过创建Derived类对象,并将其赋值给一个Base指针,我们可以调用Derived类中的函数。
public继承是最常见的继承类型,也是默认的继承类型。当public继承被用于派生类的时候,它继承了基类的所有public成员,但private成员只能被基类本身访问。下面是public继承的示例:
class Base{
public:
virtual void func(){
cout << "Base" << endl;
}
};
class Derived: public Base{
public:
void func(){
cout << "Derived" << endl;
}
};
int main(){
Derived d;
Base *ptr = &d;
ptr->func(); //输出Derived
return 0;
}
在这个示例中,Derived类从Base类中public继承,并重新定义了Base类中的虚函数。
protected继承的效果和private继承相似,但在派生类中,protected成员可以被访问。当protected继承被用于派生类的时候,它继承了基类的所有protected和public成员,private成员只能被基类本身访问。下面是protected继承的示例:
class Base{
protected:
virtual void func(){
cout << "Base" << endl;
}
};
class Derived: protected Base{
public:
void func(){
cout << "Derived" << endl;
}
};
int main(){
Derived d;
Base *ptr = &d; //编译错误
d.func(); //输出Derived
return 0;
}
在这个示例中,Derived类从Base类中protected继承,并重新定义了Base类中的虚函数。由于protected成员不能在基类的外部访问,因此在主函数中无法使用Base指针调用Derived类的函数。
private继承是一种让派生类得到基类实现而不是接口的方法,它可以让基类中的所有成员在派生类中变为private成员。下面是private继承的示例:
class Base{
private:
virtual void func(){
cout << "Base" << endl;
}
};
class Derived: private Base{
public:
void func(){
cout << "Derived" << endl;
}
};
int main(){
Derived d;
Base *ptr = &d; //编译错误
d.func(); //输出Derived
return 0;
}
在这个示例中,Derived类从Base类中private继承,并重新定义了Base类中的虚函数。由于private成员不能在基类的外部访问,因此在主函数中无法使用Base指针调用Derived类的函数。