返回

多态的面貌,cpp中的虚拟函数与继承

后端

当然,可以按照要求撰写一篇技术博客。

多态的概念

多态是指在面向对象编程中,对象具有多种形态,即同一操作作用在不同对象上,可能产生不同的结果。多态性是对象设计的一个重要特性,可以使程序代码更加灵活和复用。

举个栗子:

在动物世界中,猫和狗都属于动物,但它们的行为却大不相同。猫会喵喵叫,狗会汪汪叫。如果我们想编写一个程序来模拟动物的行为,我们可以使用多态性来实现。

class Animal {
public:
    virtual void makeSound() {
        std::cout << "Animal makes a sound." << std::endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Meow!" << std::endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "Woof!" << std::endl;
    }
};

int main() {
    Animal *animal = new Cat();
    animal->makeSound(); // Output: Meow!

    animal = new Dog();
    animal->makeSound(); // Output: Woof!

    return 0;
}

在上面的代码中,我们定义了一个Animal类,它有一个makeSound()方法。Cat类和Dog类都是Animal类的子类,它们都继承了makeSound()方法。

再举个栗子:

最近为了争夺在线支付市场,支付宝年底经常会做诱人的扫红包-支付-给奖励金的活动。那么 大家想想为什么要用扫码支付呢?在这个场景里,扫码支付的多态性体现在哪里呢?扫红包会触发一个支付行为,但是支付的方式可以是红包支付,也可以是余额支付,因为不同的支付方式都继承了同一个父类支付行为。

class Payment {
public:
    virtual void pay() {
        std::cout << "Payment is being made." << std::endl;
    }
};

class RedPacketPayment : public Payment {
public:
    void pay() override {
        std::cout << "RedPacket payment is being made." << std::endl;
    }
};

class BalancePayment : public Payment {
public:
    void pay() override {
        std::cout << "Balance payment is being made." << std::endl;
    }
};

int main() {
    Payment *payment = new RedPacketPayment();
    payment->pay(); // Output: RedPacket payment is being made.

    payment = new BalancePayment();
    payment->pay(); // Output: Balance payment is being made.

    return 0;
}

虚拟函数与继承

在C++中,多态性是通过虚拟函数和继承来实现的。虚拟函数是一种允许子类覆盖父类方法的方法。当一个函数被声明为virtual时,它就成为一个虚拟函数。

当一个函数被声明为virtual时,它就成为一个虚拟函数。当一个子类继承一个具有虚拟函数的父类时,子类就可以覆盖父类的虚拟函数。这样,当我们通过父类指针调用虚拟函数时,实际调用的将是子类的覆盖函数。

多态性是面向对象编程的一个重要特性,可以使程序代码更加灵活和复用。通过虚拟函数和继承,我们可以在C++中轻松地实现多态性。