cpp中重载和重写的区别
时间: 2023-05-20 16:05:56 浏览: 53
重载和重写都是面向对象编程中的概念,但它们的含义不同。重载是指在同一个作用域内,可以定义多个名称相同但参数个数或类型不同的函数,以便根据不同的参数类型或个数来调用不同的函数。而重写是指在派生类中重新定义基类中已有的虚函数,以便根据派生类的需要来实现不同的行为。重载是静态多态性的体现,而重写是动态多态性的体现。
相关问题
重载和重写的区别是什么?
重载(Overload)和重写(Override)是两个不同的概念。
重载是指在同一个作用域中,函数名相同但参数列表不同的多个函数,编译器会根据不同参数列表的个数、类型、顺序等进行选择调用不同的函数。
例如:
```cpp
void func(int x);
void func(int x, int y);
void func(double x);
```
这里有三个函数名相同但参数列表不同的函数,它们是重载关系。
重写是指子类中的函数与父类中的函数有相同的函数名、参数列表和返回值类型,子类中的函数会覆盖掉父类中的函数,实现多态性。
例如:
```cpp
class A {
public:
virtual void func();
};
class B : public A {
public:
void func() override; // override关键字用于明确指示这是一个重写函数
};
```
这里的B类继承自A类,并重写了A类的func()函数,实现了多态性。注意,子类中重写的函数必须与父类中的函数有相同的函数名、参数列表和返回值类型,否则就不是重写,而是重载。
osg重载apply
在OpenSceneGraph(osg)中,apply方法是定义在osg::NodeVisitor类中的,并且根据不同的节点类型进行了重载。重载后的apply方法统一调用了traverse方法,而traverse方法在不同的类中实现也不一样。
具体来说,apply方法可以被osg::NodeVisitor的子类重写覆盖,并且可以加入不同的业务逻辑。在osg::NodeVisitor类中,apply函数的定义如下:
```cpp
void NodeVisitor::apply(Node& node)
{
traverse(node);
}
void NodeVisitor::apply(Drawable& drawable)
{
apply(static_cast<Node&>(drawable));
}
```
在osg::Group类中实现了traverse方法,其定义如下:
```cpp
void Group::traverse(NodeVisitor& nv)
{
for(NodeList::iterator itr = _children.begin(); itr != _children.end(); ++itr)
{
(*itr)->accept(nv);
}
}
```
可以看到,不同类中的traverse方法的实现不同。在osg::NodeVisitor类中,traverse方法主要是为了调用当前所在节点的对应traverse方法。例如,如果当前节点是osg::Group类节点,则会调用osg::Group类对应的traverse方法。在osg::Node类中,traverse方法实际上是一个空函数,因为osg::Node类节点下不会再有子节点,遍历到此就会结束。而在osg::Group类中,traverse方法会循环调用osg::Group类节点下所有子节点的accept方法,以确保所有子节点都可以被访问到,从而进行一个新的遍历。
因此,根据以上信息,osg对apply方法进行了重载,并在不同的类中实现了不同的traverse方法来实现节点遍历的功能。