如何保护自己的网站,合肥建设网站查询,wordpress pv,中信建设我们常用基类指针指向派生类对象来实现多态性。
私有继承不允许基类指针指向派生类
基类指针只能访问到基类中含有的公有成员。
当用基类指针指向派生类对象在动态分配堆上内存的时候#xff0c;析构函数必须是虚函数!
成员如果是数据成员的话访问的是基类的版本#xff…我们常用基类指针指向派生类对象来实现多态性。
私有继承不允许基类指针指向派生类
基类指针只能访问到基类中含有的公有成员。
当用基类指针指向派生类对象在动态分配堆上内存的时候析构函数必须是虚函数!
成员如果是数据成员的话访问的是基类的版本如果派生类中含有相同名字的数据成员的话。 对于已经被重写的方法成员如果没有重写则没有什么问题如果方法成员没有用virtual修饰的话访问的仍然是基类的方法其他方法对基类方法的调用仍然是基类的方法。如果用virtual修饰以后访问的就是派生类的方法。并且基类的方法修改的是基类的数据成员如果派生类中含有相同名字的数据成员是不会被修改的。
如果将该指针赋给一个对象那么多态的性质将消失。
例如
#include iostream
using namespace std;
class A
{
public:int t;A() { cout A::A() called.\n; }virtual ~A() { cout A::~A() called.\n; }virtual void Print(){printf(A:Hello world!\n);}virtual void Set(){t 1;}
};
class B :public A
{
public:int t;B(int i){cout B::B() called.\n;buf new char[i];}void Print(){printf(B:Hello world!\n);}void Eat(){printf(B:eat\n);}virtual ~B(){delete[]buf;cout B::~B() called.\n;}void Set(){t -1;}
private:char* buf;
};
void fun(A* a)
{cout May you succeed!\n;delete a;
}
int main()
{A* a new B(15); a-Set();printf(t%d\n, a-t);a-Print(); fun(a);printf(test\n);return 0;
}运行结果 参考资料
传送门