当前位置 : 主页 > 编程语言 > c语言 >

多态(二)

来源:互联网 收集:自由互联 发布时间:2023-08-25
多态的条件: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;
}
上一篇:递推算法例题C++
下一篇:没有了
网友评论