C加加的协变和 C加加的多态请分别举例说明,并且举例说明这两种的区别
时间: 2024-04-08 11:28:58 浏览: 171
C++中的协变(covariant)和多态(polymorphism)是相关概念,但它们有着不同的含义和用法。下面我会分别举例说明这两种概念,并解释它们之间的区别。
1. 协变的例子:
```cpp
#include <iostream>
class Animal {
public:
virtual Animal* clone() const {
std::cout << "Animal cloned." << std::endl;
return new Animal(*this);
}
};
class Dog : public Animal {
public:
virtual Dog* clone() const {
std::cout << "Dog cloned." << std::endl;
return new Dog(*this);
}
};
class Cat : public Animal {
public:
virtual Cat* clone() const {
std::cout << "Cat cloned." << std::endl;
return new Cat(*this);
}
};
int main() {
Animal* animal = new Dog();
Animal* clonedAnimal = animal->clone(); // Output: "Dog cloned."
delete animal;
delete clonedAnimal;
return 0;
}
```
在上面的例子中,`Animal` 类中定义了一个虚函数 `clone()`,返回类型是 `Animal*`。在派生类 `Dog` 和 `Cat` 中,分别重写了 `clone()` 函数并返回了具体的派生类类型的指针。这就是协变的体现,通过协变,派生类可以重写基类的虚函数并返回更具体的类型。
2. 多态的例子:
```cpp
#include <iostream>
class Animal {
public:
virtual void makeSound() const {
std::cout << "Animal makes a sound." << std::endl;
}
};
class Dog : public Animal {
public:
virtual void makeSound() const {
std::cout << "Dog barks." << std::endl;
}
};
class Cat : public Animal {
public:
virtual void makeSound() const {
std::cout << "Cat meows." << std::endl;
}
};
int main() {
Animal* animal;
animal = new Dog();
animal->makeSound(); // Output: "Dog barks."
animal = new Cat();
animal->makeSound(); // Output: "Cat meows."
delete animal;
return 0;
}
```
在上面的例子中,`Animal` 类中定义了一个虚函数 `makeSound()`,并在派生类 `Dog` 和 `Cat` 中进行了重写。在 `main()` 函数中,通过基类指针调用虚函数 `makeSound()`,根据实际指向的对象类型,会调用相应的派生类的函数。这就是多态的体现,通过多态,可以根据对象的实际类型来调用相应的函数。
区别:
- 协变是针对函数返回类型的概念,允许派生类中的重写函数返回更具体的类型。
- 多态是一种运行时多态性的概念,通过基类指针或引用调用虚函数时,根据实际指向的对象类型来确定调用哪个派生类的函数。
- 协变是一种语法特性,用于指定派生类函数的返回类型。
- 多态涉及到继承、虚函数和动态绑定的特性,允许在运行时根据实际情况进行函数调用。
总结来说,协变是一种语法特性,用于指定派生类函数的返回类型,而多态是一种运行时的多态性概念,通过基类指针或引用调用虚函数时,根据实际指向的对象类型来确定调用哪个派生类的函数。
阅读全文