您的位置:首页 > 教程笔记 > 综合教程

C++ 虚拟函数与虚继承:揭示多重继承中的复杂性

2024-04-29 16:04:49 综合教程 84

虚拟函数:允许派生类重写基类中的函数。当基类指针指向派生类对象时,调用派生类的虚拟函数。虚继承:解决多重继承中的菱形继承问题。确保每个基类在派生类中只存在一个实例。

C++ 虚拟函数与虚继承:揭示多重继承中的复杂性 虚拟函数

虚拟函数是 C++ 中一种特殊类型的成员函数,允许派生类重写基类中的函数。当基类指针或引用指向派生类对象时,将会调用派生类的虚拟函数。

class Shape {
public:
  virtual double area() const = 0; // 纯虚函数
};

class Rectangle : public Shape {
public:
  Rectangle(double width, double height) : m_width(width), m_height(height) {}
  double area() const override { return m_width * m_height; } // 重写虚函数

private:
  double m_width;
  double m_height;
};
虚继承

虚继承是一种技术,用于解决多重继承中发生的菱形继承问题(也称为多重继承的歧义性)。

class Animal {
public:
  virtual void speak() const { cout << "Animal speaks" << endl; }
};

class Dog : virtual public Animal { // 虚继承
public:
  void speak() const override { cout << "Dog barks" << endl; }
};

class Cat : virtual public Animal { // 虚继承
public:
  void speak() const override { cout << "Cat meows" << endl; }
};

class SiberianHusky : public Dog, public Cat { // 多重继承
public:
  void speak() const override { cout << "Siberian Husky howls" << endl; }
};

虚继承确保每个基类()在派生类()中只存在一个实例,从而避免菱形继承问题。

实战案例
#include <iostream>

using namespace std;

class Shape {
public:
  virtual double area() const = 0;
};

class Rectangle : public Shape {
public:
  Rectangle(double width, double height) : m_width(width), m_height(height) {}
  double area() const override { return m_width * m_height; }

private:
  double m_width;
  double m_height;
};

class Circle : public Shape {
public:
  Circle(double radius) : m_radius(radius) {}
  double area() const override { return M_PI * m_radius * m_radius; }

private:
  double m_radius;
};

int main() {
  // 创建形状的父类指针
  Shape* shape;

  // 创建矩形对象并将其分配给父类指针
  shape = new Rectangle(5, 10);
  cout << "矩形面积:" << shape->area() << endl;

  // 创建圆形对象并将其分配给父类指针
  shape = new Circle(3);
  cout << "圆形面积:" << shape->area() << endl;

  return 0;
}

相关推荐

  • 如何理解golang函数签名

    如何理解golang函数签名

    go 函数签名由函数名、参数类型和返回值类型组成。参数类型指定函数接受的参数,用逗号分隔。返回值类型指定函数返回的值,同样用逗号分隔。例如,函数签名 func add(x int, y int) in

    综合教程 2024-04-29 16:04:48 27
  • c++中的setw函数有什么用

    c++中的setw函数有什么用

    setw 函数用途:setw 函数用于设置输出的字段宽度。它接收一个整数值参数,该参数指定输出字段的宽度。语法:="cpp"std::setw(int width);/cod

    综合教程 2024-04-29 16:04:35 100
  • c++中cin.getline函数用法

    c++中cin.getline函数用法

    cin.getline() 函数的用法简介:cin.getline() 函数是 C++ 中用于从标准输入读取一行字符的函数。该函数从流中读取字符,直到遇到换行符 (\n) 或到达指定的最大字符数。语法

    综合教程 2024-04-29 16:04:30 66
  • C++ 内联函数的最佳实践技巧分享

    C++ 内联函数的最佳实践技巧分享

    内联函数是一种将函数代码直接替换到调用点的 c++++ 特性,从而优化性能。最佳实践包括:谨慎使用内联,只针对微小、频繁调用的函数。避免递归和循环,因为它们会增加函数大小和复杂度。保持内联函数小巧,通

    综合教程 2024-04-29 16:04:26 100
  • golang函数类型的分类及作用

    golang函数类型的分类及作用

    go 语言中的函数类型是函数指针的类型,可分为以下几类:func:最通用函数类型参数类型和返回值类型:指定函数参数和返回值类型可变参数:允许函数接受任意数量的参数命名返回值:允许函数具有多个具有名称的

    综合教程 2024-04-29 16:04:25 23