在C++中,类也可以通过动态内存分配的方式来使用,如下:
#include <iostream>
class Animal{
public:
virtual void show(){
std::cout << "animal" << std::endl;
}
};
class Tiger :public Animal{
public:
void show() override{
std::cout << "tiger" << std::endl;
}
};
int main(){
Animal* animal = new Animal;
Tiger* tiger = new Tiger;
animal->show();
tiger->show();
delete animal;
delete tiger;
system("pause");
return 0;
}
在上面的代码中,通过动态内存分配的方式来分别调用父类和子类中的函数方法。
这些都只是普通的指针的使用,对于子类和父类还可以通过一种方法实现函数的调用,即父类指针指向子类的内存。如下:
#include <iostream>
class Animal{
public:
virtual void show(){
std::cout << "animal" << std::endl;
}
};
class Tiger :public Animal{
public:
void show() override{
std::cout << "tiger" << std::endl;
}
};
int main(){
Animal* animal = new Animal;
Animal* tiger = new Tiger;
animal->show();
tiger->show();
delete animal;
delete tiger;
system("pause");
return 0;
}
在此段代码中,我们用一个Animal类的指针来指向一块子类Tiger的地址。此时,调用tiger中的函数调用的则是Tiger类中的函数,而不是父类Animal中的了。
同样的道理,可以通过直接分配的方式来使用,那么,也可以通过指向其他变量的方法使用,如下:
int main(){
Animal animal;
Tiger tiger;
animal.show();
tiger.show();
Animal* an = nullptr;
an = &animal;
an->show();
an = &tiger;
an->show();
system("pause");
return 0;
}
将主函数中的内容进行修改,创建一个父类指针,父类指针指向何种类型,就会调用何种类中的方法。
同样的道理,对于引用也是如此。但是,引用的对象是在一开始就已经确认的,后期是无法修改引用的对象的,这是引用和指针的不同之处,需要注意。但是对于函数传参来说则没有这么多显示,因为传参的对象是在一开始就已经决定好了的,后面基本不会再做修改。使用者在使用时可以酌情考虑进行使用。