【C++】面向对象编程,为什么将父类指针用子类实例化?(code c++)


实例化概念

定义

实例化是指在面向对象的编程中,把用类创建对象的过程称为实例化。是将一个抽象的概念类,具体到该类实物的过程。

形式

实例化过程中一般由类名 *对象名 = new 类名(参数1,参数2…参数n)构成。


为什么将父类指针用子类实例化?

目的——实现多态

这个实例是子类的,但父类声明,所以正常情况下,访问不到子类中非继承自父类的成员;换句话说,只能访问到子类从父类继承来的 override 成员 + 父类原有的未被该子类 override 成员(第二部分包括所有非 virtual 成员)。

再换一句话说,当前在子类中用 override 重写父类中 virtual 申明的虚方法,此时父类声明对象并通过子类实例化,接着调用该方法,调用的是父类的函数,执行时的是子类中重写的方法。场景如函数传参,形参为父类类型,传入子类,其调用方式相同,而调用的是子类重写后方法,增加了接口通用性。而如果形参为某个子类类型,那么只能传入该子类,多态也就不存在。(此处推荐了解虚函数表,从 C++ 语言设计的角度出发,探索 C++ 对象模型,加深对 OOP 三大特性之一多态的理解,感受其语言设计哲学的魅力)

程序代码

实现多态 code c++

#include <iostream>
#include <ctime>
using namespace std;

class Animal {
public :
    Animal() = default;
    Animal(string name) : name(name) {}
    virtual void run() {
        cout << "I don't know how to run" << endl;
    }
    virtual void getName() final {}
    void testFunc() {
        cout << "Animal class" << endl;
    }
    virtual void fl1() {}
private:
    string name;
};

class Cat : public Animal {
public :
    Cat(string name) : Animal(name) {}
    void run() override final {
        cout << "I can run whilth four legs" << endl;
    }
    void fl1() override {}
};

class People : public Animal {
public : 
    People(string name) : Animal(name) {}
    void run() override {
        cout << "I can run with two legs" << endl;
    }
};

class Bat : public Animal {
public :
    Bat(string name) : Animal(name) {} 
    void run() override {
        cout << "I can fly" << endl;
    }
};

int main() { // 建议读者, 去虚函数声明及重载, 再运行程序代码查看结果, 可对实现多态的操作加深理解
    #define MAX_N 10
    srand(time(0));
    Animal **zoo = new Animal*[MAX_N];
    for (int i = 0; i < MAX_N; ++i) {
        switch(rand() % 3) {
            case 0: zoo[i] = new Cat("cat"); break;
            case 1: zoo[i] = new People("people"); break;
            case 2: zoo[i] = new Bat("bat"); break;
        }
    }
    for (int i = 0; i < MAX_N; ++i) {
        zoo[i]->run();
        zoo[i]->testFunc();
        cout << "------------" << endl;
    }
    return 0;
}

运行结果

I can run whilth four legs
Animal class
------------
I can run whilth four legs
Animal class
------------
I can run whilth four legs
Animal class
------------
I can run whilth four legs
Animal class
------------
I can run with two legs
Animal class
------------
I can run with two legs
Animal class
------------
I can run whilth four legs
Animal class
------------
I can run whilth four legs
Animal class
------------
I can fly
Animal class
------------
I can run whilth four legs
Animal class
------------

结论

代码示例,有问题留言。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idiot5liev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值