21xrx.com
2024-12-22 21:02:35 Sunday
登录
文章检索 我的文章 写文章
C++中多态的实现方法
2023-07-14 00:57:48 深夜i     --     --
C++ 多态 虚函数 继承 指针

C++是一种面向对象编程语言,它支持多种多态性的实现方法。所谓多态性,就是同一种行为可以通过多种方式实现或表现。

在C++中,多态可以通过三种方式实现,分别是虚函数、模板和RTTI。

1. 虚函数

虚函数是C++实现多态的一种重要方式。虚函数是在基类中定义的,其子类可以覆盖该函数并提供自己的实现。在调用虚函数时,实际上会根据调用者的具体类型来决定调用哪个实现。

虚函数的使用方法如下:

- 在成员函数前面加上关键字`virtual`,表示该函数是虚函数;

- 基类中定义虚函数的实现;

- 子类中覆盖基类虚函数的实现。

例如,我们可以定义一个动物类,其中包含一个声音的虚函数:


class Animal {

public:

  virtual void sound() { }

};

接着,我们可以定义一个狗类,覆盖动物类的声音函数:


class Dog : public Animal {

public:

  void sound() override std::cout << "汪汪汪" << std::endl;

};

当我们调用`sound()`函数时,会根据具体对象的类型来确定调用哪个实现:


Animal* animal = new Dog();

animal->sound();  // 输出:汪汪汪

这里我们通过基类类型的指针调用了子类的实现,即实现了多态。

2. 模板

另一种实现多态的方式是使用模板。模板是一种泛型编程方式,可以使函数或类在不同的类型上表现出相同的行为。

例如,我们可以定义一个打印函数:


template<typename T>

void print(T t)

  std::cout << t << std::endl;

然后我们可以使用该函数来打印不同的类型:


print(1);  // 输出:1

print("hello"); // 输出:hello

这里我们通过模板实现了不同类型的行为,即实现了多态。

3. RTTI

C++还支持在运行时检查对象的类型,这种方式称为运行时类型识别(RTTI)。RTTI可以通过`typeid`运算符来实现,它可以返回一个指向`std::type_info`类型的对象,该对象包含有关类型的信息。

例如,我们可以定义一个动物类和一个狗类,并使用`typeid`来检查它们的类型:


class Animal { };

class Dog : public Animal { };

Dog* dog = new Dog();

Animal* animal = dog;

if (typeid(*animal) == typeid(Dog))

  std::cout << "这是一只狗" << std::endl;

这里我们通过`typeid`检查了动物类型的对象是否是狗类型的对象,即实现了多态。

总结

C++支持多种方式实现多态,包括虚函数、模板和RTTI。虚函数是最常用的方式,在实现时需要注意虚函数的定义和实现,以及子类覆盖虚函数的方法。模板和RTTI可以更灵活地实现多态,但应用场景相对有限,需要谨慎使用。

  
  

评论区

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