多态使用注意点一:不要在构造析构过程中调用virtual函数
#include <iostream>
using namespace std;
class AA
{
public:
AA(int a = 0)
{
this->a = a;
print(); //在构造函数里面能实现多态吗?
}
//分析一下要想实现多态,c++编译器应该动什么手脚
//第一个需要动手脚的地方 起码这个函数print 我应该特殊处理
virtual void print()
{
cout << "父类的" << "a = " << a << endl;
}
protected:
int a;
};
class BB : public AA
{
public:
BB(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
virtual void print()
{
cout << "子类的" << "a = " << a << ", b = " << b << endl;
}
private:
int b;
};
void howToPrintf(AA *pBase)
{
//pBase 我怎么知道是父类对象还是子类对象
//动手脚2::区分是父类对象还是子类对象,提前布局
pBase->print(); //
}
void main()
{
//AA a1;
BB b1;
//howToPrintf(&a1);
howToPrintf(&b1);
}
多态使用注意点二:
#include <iostream>
using namespace std;
//指针也是一种数据类型,指针数据的数据类型是指,它所指的内存空间的数据类型
//最后一点引申 指针的步长
class Parent
{
protected:
int i;
int j;
public:
virtual void func()
{
cout << "Parent::func()" << endl;
}
};
class Child : public Parent
{
public:
//int k; //注意点
public:
Child(int i, int j)
{
cout << "Child(int i, int j)" << endl;
}
virtual void func()
{
cout << "Child::func()" << endl;
}
};
void howToCallFunc(Parent *pBase)
{
pBase->func();
}
//指针的步长 在c++领域仍然有效,父类指针的步长和子类指针的步长不一样
//多态是靠迟绑定实现的(vptr+函数指针实现)
int main()
{
int i = 0;
Parent* p = NULL;
Child* c = NULL;
//不要把父类对象还有子类对象同事放在一个数组里面
Child ca[3] = { Child(1, 2), Child(3, 4), Child(5, 6) };
//不要用父类指针做赋值指针变量,去遍历一个子类的数组。
p = ca;
c = ca;
p->func();
c->func(); //有多态发生
p++;
c++;
p->func();//有多态发生
c->func();
for (i = 0; i < 3; i++)
{
howToCallFunc(&(ca[i]));
}
return 0;
}