多态的条件:1.虚函数的重写:三同(函数名、参数、返回值)2.父类的指针或者引用去调用。 1.不满足多态看类型--看调用者的类型,调用这个类型的成员函数。 2.满足多态 -- 看指向的
多态的条件:1.虚函数的重写:三同(函数名、参数、返回值)2.父类的指针或者引用去调用。
1.不满足多态看类型--看调用者的类型,调用这个类型的成员函数。
2.满足多态 -- 看指向的对象的类型,调用这个类型的成员函数。
下面的代码中不构成重写,是隐藏关系。
class Person {
public:
void Buyticket()
{
cout << "买票-全价" << endl;
}
};
class Student :public Person {
public:
//重写/覆盖
virtual void Buyticket()
{
cout << "买票-半价" << endl;
}
};
什么时候能够体现出隐藏关系,子类调用的时候才能体现出来。上面的代码中没有隐藏关系的体现。隐藏的时候调用父类可以指定作用域。
子类可以不写关键字:也可以构成重写。
class Person {
public:
virtual void Buyticket()
{
cout << "买票-全价" << endl;
}
};
class Student :public Person {
public:
//重写/覆盖
void Buyticket()
{
cout << "买票-半价" << endl;
}
};
重写体现的是接口继承,就是把函数的声明继承下来重写的是函数的实现。子类不写关键字也可以,因为他继承父类的接口,重写实现。
当我们使用父类的指针去调用的时候:
class Person {
public:
virtual void Buyticket()
{
cout << "买票-全价" << endl;
}
~Person()
{
cout << " ~Person()" << endl;
}
};
class Student :public Person {
public:
//重写/覆盖
void Buyticket()
{
cout << "买票-半价" << endl;
}
~Student()
{
cout << " ~Student()" << endl;
}
};
void Func(Person* p)
{
p->Buyticket();
delete p;
}
int main()
{
Func(new Person);
Func(new Student);
return 0;
}