实例化概念
定义
实例化是指在面向对象的编程中,把用类创建对象的过程称为实例化。是将一个抽象的概念类,具体到该类实物的过程。
形式
实例化过程中一般由类名 *对象名 = 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
------------
结论
代码示例,有问题留言。