21xrx.com
2024-12-22 20:17:37 Sunday
登录
文章检索 我的文章 写文章
C++中的覆盖和隐藏
2023-06-27 10:31:23 深夜i     --     --
C++ 覆盖 隐藏 继承 虚函数

在C++语言中,有两种重要的概念,即“覆盖”和“隐藏”。这两个概念都是面向对象编程中的重要部分,下面将分别介绍它们的概念以及对程序的影响。

1. 覆盖

在C++中,覆盖(override)是指在派生类中重新实现基类中的虚函数。这意味着当派生类对象调用基类中的虚函数时,会优先执行派生类中实现的该函数。这样的重载是动态的,即在运行时根据对象的类型来确定调用哪个函数。

例如,以下是一个简单的基类和派生类:


class Animal {

public:

 virtual void speak()

  std::cout << "I am an animal." << std::endl;

 

};

class Cat : public Animal {

public:

 void speak() override

  std::cout << "I am a cat." << std::endl;

 

};

在这个例子中,Animal类有一个虚函数speak(),它被Cat类覆盖实现。当Cat对象调用speak()时,会执行Cat类中实现的该函数。

2. 隐藏

隐藏(hide)是指在派生类中定义了与基类中同名的非虚函数。在这种情况下,当派生类对象调用这个函数时,会优先调用派生类中的函数,而不会调用基类中的函数。这样的重载是静态的,编译器会根据函数的声明确定要调用哪个函数,与对象的类型无关。

例如,以下是一个基类和派生类:


class Shape {

public:

 void draw()

  std::cout << "I am a shape." << std::endl;

 

};

class Circle : public Shape {

public:

 void draw()

  std::cout << "I am a circle." << std::endl;

 

};

在这个例子中,Shape类有一个非虚函数draw(),它被Circle类隐藏实现。因此,当Circle对象调用draw()时,总是执行Circle类中定义的函数。

总结

覆盖和隐藏是C++中面向对象编程的重要概念。覆盖是指在派生类中重新实现基类的虚函数,而隐藏是指在派生类中定义了与基类同名的非虚函数。这两种重载的区别在于它们是动态的还是静态的,以及根据对象的类型来确定调用的函数还是根据函数的声明确定调用的函数。需要注意的是,覆盖只适用于虚函数,而隐藏适用于非虚函数。在程序设计中,开发人员需要根据具体的需求和设计来选择合适的重载方式。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复