最近几天看了一些关于C++动态转换的语法,终于理解了历史上程序员发明python的动机之一
C++中只有指针和引用具有多态性,多态性是面向对象编程的好处之一。
如果一个类ClassA(继承于ClassB)是从栈上分配的,比如ClassA a;那么基类ClassB b = a;会造成数据截断损失,而从堆区分配的指针则不会,比如ClassB *b= new ClassA(),可以通过动态转换dynamic_cast转回派生类。(以前以为指针是因为堆区比较大才用的,现在才发现好像多态性才是最关键的)还有返回从堆区分配的指针可以防止对象被析构是内存空间的释放,这点在多线程编程中尤为重要,栈上分配的变量如果传给另一个线程,运行中释放掉空间很容易造成程序崩溃
而某些函数由于设计需要,必须返回基类的信息,所以应该返回基类的指针。
举个例子:
#include <iostream>
using namespace std;
class Father
{
public:
Father() {}
virtual ~Father() { cout << "Father has been deconstructed" << endl; }
};
class Child :public Father
{
public:
Child(){}
virtual ~Child() {}
int get5() { return 5; }
};
Father *GetPaticificateChild()
{
return new Child();
}
int main()
{
Father *fa = GetPaticificateChild();
fa->get5();//错误,提示Father类没有该方法
Child *ch = dynamic_cast<Child*>(fa);
if (ch != NULL)
cout << ch->get5() << endl;
return 0;
}
虚函数和虚表给了子类改变指向父类的指针运行虚函数的方式机会。运行时根据虚表里的内容决定实际执行的虚函数内容,虚表应该大多也放在数据段里。
因此可能python的发明者将之归结为C++编译功能的问题,所以设计了一个处处都是多态的python
当使用python实现上述功能时就没有任何问题,返回值可以直接调用方法,python运行时才动态的决定变量的类型,与之对应的是额外的开销
因篇幅问题不能全部显示,请点此查看更多更全内容