C++系列十:日常学习-非多态类型和多态类型

介绍:

  1. 非多态类型和多态类型是C++中的两种类型,它们的主要区别在于是否包含虚函数和是否能进行动态绑定。
  2. 非多态类型是指没有虚函数的类型。这种类型在编译时进行类型检查,因此不能在运行时改变其静态类型。对于非多态类型,编译器在编译时就已经确定了其所有信息,包括成员变量、成员函数等,因此不能在运行时动态地改变这些信息。
  3. 多态类型则相反,它包含虚函数,可以在运行时改变其静态类型。多态类型在编译时只确定一部分信息,例如成员变量、成员函数等,而另一部分信息则在运行时通过动态绑定确定。因此,多态类型可以在运行时动态地改变其行为,例如通过覆盖虚函数实现不同的功能。
  4. 需要注意的是,非多态类型和多态类型并不是一种严格的分类方式,而是一种相对的概念。一种类型可能是非多态的,但在继承和覆盖的情况下可能会变成多态的。同样,一种类型可能是多态的,但在没有虚函数的情况下也可能变成非多态的。

案例:

非多态类型示例:
#include <iostream>  
  
class NonPolymorphic {  
public:  
    int value;  
  
    NonPolymorphic(int value) : value(value) {}  
  
    void printValue() const {  
        std::cout << "The value is: " << value << std::endl;  
    }  
};  
  
int main() {  
    NonPolymorphic np1(10);  
    NonPolymorphic np2(20);  
  
    np1.printValue();  // Output: The value is: 10  
    np2.printValue();  // Output: The value is: 20  
  
    return 0;  
}

在这个例子中,NonPolymorphic类是一个非多态类型,它有一个方法printValue(),无论通过哪个对象调用这个方法,都会产生同样的结果。因此,非多态类型的行为在编译时就已经确定。



多态类型示例:
#include <iostream>  
  
class Base {  
public:  
    virtual void printValue() const {  
        std::cout << "The value in Base is: 10" << std::endl;  
    }  
};  
  
class Derived : public Base {  
public:  
    void printValue() const override {  
        std::cout << "The value in Derived is: 20" << std::endl;  
    }  
};  
  
int main() {  
    Base* b1 = new Derived; // 向上转型,将Derived的对象转型为Base  
    Base* b2 = new Base; // 同上  
  
    b1->printValue(); // Output: The value in Derived is: 20,因为b1指向的对象是Derived类型,所以调用的是Derived的printValue方法。  
    b2->printValue(); // Output: The value in Base is: 10,因为b2指向的对象是Base类型,所以调用的是Base的printValue方法。  
  
    delete b1;  
    delete b2;  
  
    return 0;  
}

在这个例子中,Base类是一个多态类型,它有一个虚函数printValue()。通过基类指针调用这个方法时,会根据实际指向的对象类型来决定执行哪个版本的实现。因此,同样的方法调用会产生不同的结果。这就是多态的表现。
posted @ 2023-09-05 08:58  cactus9  阅读(65)  评论(0编辑  收藏  举报